2010-07-06 28 views
6

Tôi có một vài giao diện với cùng các hằng số - ID và ROOT. Tôi cũng có một phương thức mà trong đó tôi truyền một đối tượng sẽ thực hiện một trong các giao diện này.Làm thế nào để tự động lấy một hằng số trong java?

Làm thế nào tôi có thể tự động lấy giá trị của hằng số phụ thuộc vào lớp thông qua năm - tức là tôi muốn làm một cái gì đó như sau:

public void indexRootNode(Node node, Class rootNodeClass) 
{ 
    indexService.index(node, rootNodeClass.getConstant('ID'), 
     rootNodeClass.getConstant('ROOT')); 
} 

Trong PHP này là dễ dàng, nhưng có thể như vậy trong Java ? Tôi đã nhìn thấy vấn đề này được giải quyết bằng cách sử dụng accessors trên hằng số, nhưng tôi muốn lấy trực tiếp các hằng số. Chú thích sẽ không giúp tôi ở đây.

Cảm ơn

+0

Hãy nhìn vào phản ánh – willcodejavaforfood

+1

hãy có một cái nhìn tại câu hỏi này về lưu trữ hằng trong giao diện: http://stackoverflow.com/questions/1372991/should-a-collection-of-constants-be-placed-in-a-class-or-interface Hầu hết mọi người đồng ý, rằng một giao diện không phải là một thực thể tốt để lưu trữ các hằng số. –

+0

Cảm ơn, tôi đã không thấy điều đó. Các giao diện tôi đã tạo không phải là tập hợp các hằng số. Tôi có thể nghĩ về việc thêm các phương thức accessor vào giao diện, nhưng đối với ngắn gọn, tôi nghĩ trong trường hợp này, việc thêm các hằng số vào giao diện sẽ đơn giản hơn. –

Trả lời

7

này có thể đạt được bằng reflection (xem thêm tương ứng javadoc).

public void indexRootNode(Node node, Class rootNodeClass) 
{ 
    Field idField = rootNodeClass.getField("ID"); 
    Object idValue = idField.get(null); 
    Field roorField = rootNodeClass.getField("ROOT"); 
    Object rootValue = rootField.get(null); 

    indexService.index(node, idValue, rootValue); 
} 

Có thể bạn phải thêm các giá trị cho loại tương ứng.

+0

tuyệt vời, cảm ơn rất nhiều –

0

Vui lòng đọc chương 19 use interfaces only to define types từ Joshua Bloch Effective Java (trong thực tế, vui lòng đọc toàn bộ cuốn sách)

Constants không thuộc trong một giao diện !!! Các hằng số phải được gắn với các lớp thực hiện chứ không phải các giao diện.

Hoặc sử dụng các phương pháp không liên tục:

// the implementing classes can define these values 
// and internally use constants if they wish to 
public interface BaseInterface{ 
    String id(); // or getId() 
    String root(); // or getRoot() 
} 

public interface MyInterface1 extends BaseInterface{ 
    void myMethodA(); 
} 

public interface MyInterface2 extends BaseInterface{ 
    void myMethodB(); 
} 

hoặc sử dụng một enum để buộc mọi thứ với nhau:

public enum Helper{ 

    ITEM1(MyInterface1.class, "foo", "bar"), 
    ITEM2(MyInterface2.class, "foo2", "baz"), 
    ; 

    public static String getId(final Class<? extends BaseInterface> clazz){ 
     return fromInterfaceClass(clazz).getId(); 

    } 

    public static String getRoot(final Class<? extends BaseInterface> clazz){ 
     return fromInterfaceClass(clazz).getRoot(); 
    } 

    private static Helper fromInterfaceClass(final Class<? extends BaseInterface> clazz){ 
     Helper result = null; 
     for(final Helper candidate : values()){ 
      if(candidate.clazz.isAssignableFrom(clazz)){ 
       result = candidate; 
      } 
     } 
     return result; 
    } 

    private final Class<? extends BaseInterface> clazz; 

    private final String root; 

    private final String id; 

    private Helper(final Class<? extends BaseInterface> clazz, 
     final String root, 
     final String id){ 
     this.clazz = clazz; 
     this.root = root; 
     this.id = id; 

    }; 

    public String getId(){ 
     return this.id; 
    } 

    public String getRoot(){ 
     return this.root; 
    } 

} 

// use it like this 
String root = Helper.fromInterfaceClass(MyInterface1.class).getRoot(); 
Các vấn đề liên quan