2010-03-27 28 views
7

Tôi muốn sử dụng Annotation ở dạng biên dịch an toàn.Enums and Annotations

Để chuyển giá trị() vào Chú thích, tôi muốn sử dụng biểu diễn Chuỗi của một enum.

Có cách nào để sử dụng @A với giá trị từ enum E không?

public class T { 

    public enum E { 
     a,b; 
    } 

    // C1: i want this, but it won't compile 
    @A(E.a) 
    void bar() { 

    // C2: no chance, it won't compile 
    @A(E.a.toString()) 
    void bar2() { 

    } 
    // C3: this is ok 
    @A("a"+"b") 
    void bar3() { 

    } 

    // C4: is constant like C3, is'nt it ? 
    @A(""+E.a) 
    void bar4() { 

    } 
} 

@interface A { 
    String value(); 
} 

Cập nhật

tôi cần những kiểu String trong @A.

Vấn đề là tôi có thể làm điều này

@A("" + 1) 
    void foo() { 
} 

Nhưng ở đây những tuyên bố biên dịch "giá trị thuộc tính phải được liên tục". Is'nt E.a không đổi?

@A("" + E.a) 
    void foo() { 
} 

Trả lời

9

Vấn đề là bạn thông minh hơn các trình biên dịch :-)

E.a là một hằng số, nhưng E.a.toString() thì không. Có vẻ như nó nên được, nhưng trình biên dịch không thể tìm ra điều đó.

Lý do tại sao "a"+"b""" + 1 hoạt động là trình biên dịch đủ thông minh để tạo các hằng số tại thời gian biên dịch.

Khi nó thấy "" + E.a, nó sử dụng E.a.toString(). Cuộc gọi đến toString() là đủ để vứt nó đi.

E có phải là một sự kiện không? Bạn có thể thử:

public final class E { 
    public static final String a = "a"; 
    public static final String b = "b"; 
}; 
+0

"E có phải là một enum không? Bạn có thể thử: ..." Tôi nghĩ bạn có thể làm điều tương tự với enums. Bạn sẽ phải truyền trong String mà bạn muốn trong hàm tạo cho 'E', sau đó gán nó cho' chuỗi cuối cùng công khai strRepresentation'. Và sau đó chỉ cần làm '@A (E.strRepresentation)' – MatrixFrog

+0

@MatrixFrog Thậm chí nếu tôi đặt 'chuỗi cuối cùng công khai strRepresentation =" foo ";' trên E, tôi nhận được 'giá trị thuộc tính phải là hằng số' – leedm777

7

Tận dụng giá trị trong chú thích kiểu E:

@interface A { 
    E value(); 
} 

Sau đó, bạn có thể sử dụng

@A(E.a)