2012-02-19 44 views
6

Có cách nào sử dụng các phương pháp ma thuật trong Java như có trong PHP với __call không?Phương pháp gọi ma thuật trong Java

Ví dụ:

class foo { 
    @Setter @Getter 
    int id; 

    @Getter 
    Map <String, ClassInFoo> myMap; 

    protected class ClassInFoo { 
      @Setter @Getter 
      String name; 
    } 

    @Setter 
    String defaultKey; 
} 

Tôi đang sử dụng Project Lombok chú thích cho getter và setter để đơn giản hóa các mã.

Hãy xem xét rằng bản đồ của tôi chứa một số mục được ánh xạ bởi Chuỗi và defaultKey xác định mặc định.

Điều tôi muốn là có thể gọi foo.getName() sẽ trả về tên mặc định là foo.myMap.get(defaultKey).getName().

Lý do tôi không thể viết tất cả các getters theo cách thủ công là lớp Foo trong thực tế được thừa hưởng với generics và lớp bên trong có thể khác nhau.

tôi loại cần một cái gì đó như:

function Object __call(method) { 
      if (exist_method(this.method) 
       return this.method(); 
      else 
       return this.myMap.get(defaultKey).method(); 
    } 

Đây có phải là bằng cách nào đó có thể trong Java?

EDIT:

tôi đã thực hiện một thí dụ rõ ràng hơn về những gì tôi đang cố gắng để đạt được ở đây: https://gist.github.com/1864457

Lý do duy nhất để làm điều này là để "viết tắt" các phương pháp trong lớp bên trong.

+0

Bỏ phiếu là một câu hỏi thú vị, nhưng điều này không nên được gắn thẻ OOP. Tính năng bạn quan tâm không phải là đối tượng được định hướng và trên thực tế, thậm chí không nhất thiết phải năng động. – Perception

+1

Nói chung, bạn muốn có getter và setters của riêng bạn mà bạn có thể tạo ra với IDE của bạn. Ví dụ, nó không phải là một ý tưởng tốt để có một getter trả về một bộ sưu tập có thể thay đổi. thay vào đó bạn có thể có 'ClassInFoo getMyMap (String name)' –

+0

Vâng, tôi có thể viết tất cả các getters, nhưng tôi thấy nó trùng lặp và xấu xí. Tôi sẽ chỉ như thế này để những người viết mã HTML của tôi có thể yêu cầu những phương thức này một cách đơn giản. –

Trả lời

5

Bạn hoàn toàn có thể thông qua reflection bằng cách sử dụng các tính năng của nó như

public Method getMethod(String name, Class<?>... parameterTypes) 

có thể được sử dụng để xem nếu một lớp học có một số phương pháp được xác định nhưng tôi không thấy làm thế nào vấn đề của bạn không thể được giải quyết với một sử dụng thích hợp o giao diện f, thừa kế và trọng các phương pháp

tính năng như phản ánh được cung cấp để quản lý một số vấn đề, nếu không thể giải quyết, nhưng Java không phải là PHP vì vậy bạn nên cố gắng tránh sử dụng nó khi có thể, vì nó không có trong triết lý của ngôn ngữ.

+0

Phản ánh đã giúp tôi giải quyết vấn đề. Cảm ơn! –

2

Đó không phải là toàn bộ điểm thừa kế và ghi đè?

lớp Base:

public Object foo() { 
    return this.myMap.get(defaultKey).method(); 
} 

Subclass:

@Overrides 
public Object foo() { 
    return whateverIWant; 
} 
+0

Tôi đã thực hiện một ví dụ chính xác hơn ở đây: https://gist.github.com/1864457 - bạn có thể vui lòng giải thích đề xuất của mình chi tiết hơn không? Cảm ơn. –

+0

Nếu phương thức getName() trong lớp Fruit được thực hiện như thế này, nó sẽ hoạt động như mong đợi: return 'getContents(). Get (getDefaultKey()). GetName()'. Bạn có hiểu cách kế thừa và công việc ghi đè không? Đọc http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html –

Các vấn đề liên quan