2009-06-24 37 views
15

Hiện tại tôi đang phát triển một khung công tác ràng buộc dựa trên chú thích cho Java Swing sử dụng JGoodies Binding dưới mui xe. Thật không may tôi bị mắc kẹt với một chú thích cho một ràng buộc JRadioButton. Điều tôi muốn làm là chỉ định tên thuộc tính của một mô hình có giá trị đặc biệt (enum). Nút radio sẽ được chọn nếu thuộc tính này có giá trị cụ thể. Bây giờ tôi muốn chỉ định các giá trị trong các chú thích như thế này:Có cách nào để khai báo thuộc tính chú thích cho * any * enum không?

@RadioButtonBinding(property = "selectedItem", selectedValue = MyEnum.FIRST) 
JRadioButton firstButton 

@RadioButtonBinding(property = "selectedItem", selectedValue = MyEnum.SECOND) 
JRadioButton secondButton 

Tuy nhiên, tôi không biết làm thế nào để khai báo các chú thích để cho phép các bên trên và bất kỳ enum khác nữa. Dự đoán đầu tiên của tôi là điều này, nhưng tôi đã biết rằng các thuộc tính chú thích không thể là chung chung:

@Documented 
@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.FIELD) 
public @interface RadioButtonBinding { 

    /** The model-property to which the selected value is bound */ 
    String property(); 

    // Idea 1: Specifying the enum class and the enum constant as String - works but is not typesafe 

    Class<? extends Enum<?>> enumClass(); 

    String enumConstantName(); 

    // Idea 2: Directly specifying the enum constant - gives a compile-time error 

    <T extends Enum<T>> T enumValue(); 

} 

Bất kỳ ý tưởng nào để giải quyết vấn đề này?

+0

Chú thích RadioButtonBinding được liệt kê ở đây bao gồm hai ý tưởng: Đầu tiên là chỉ định lớp Enum và hằng số Chuỗi để sử dụng từ nó. Nhưng đây không phải là loại an toàn của khóa học và có thể dẫn đến RuntimeExceptions. Thứ hai là xác định giá trị của một enum trực tiếp, nhưng điều này dường như không hoạt động. –

+0

btw Tôi đã làm rất nhiều loại công cụ này với JGoodies, một trong những lần đau khổ hơn tôi đã có trong Java. Vấn đề lớn nhất là anh ta có một lớp "cơ sở" mà hầu hết các lớp khác của anh ta mở rộng và vì vậy các phương thức của anh ta có chữ ký như phương thức (base, base, base), trong đó lớp "base" được truyền vào phải là một instance cụ thể nhưng chữ ký cho bạn không có gợi ý về chỉ là những gì lớp cụ thể nó phải là một thể hiện của. Phần ràng buộc là một ý tưởng hay nhưng anh ta không ủng hộ nó vào thời điểm đó (nhiều năm trước) và nó chưa hoàn thành và chỉ được viết bằng tiếng Đức. –

Trả lời

3

Nó sẽ không hoạt động theo cách bạn muốn. Như bạn đã phát hiện ra, bạn chỉ có thể sử dụng các loại trả về thực sự đơn giản trong chú thích. Ngoài ra, cố gắng vượt qua những hạn chế này bằng cách thực hiện các công cụ như lạm dụng Chuỗi sẽ không hoạt động vì bạn cần phải sử dụng cụm từ liên tục để khởi tạo giá trị của chú thích.

Tôi nghĩ rằng gần nhất bạn sẽ nhận được là khởi tạo bằng một chuỗi và sau đó sử dụng mã để so sánh với tên của enum(). Nhưng có đi loại an toàn của bạn ...

1

Nếu enums của bạn có thể thực hiện tất cả các giao diện tương tự, bạn có thể tìm thấy hữu ích câu hỏi này "Coding tip - intersection types and java enums"

+0

Thật không may là không, nhưng cảm ơn cho tip anyway. –

+0

Bạn sẽ sử dụng giao diện phổ biến đó như thế nào trong thuộc tính chú thích? ' & MyInterface> T enumValue();' không hoạt động tốt hơn không có giao diện. – Imre

0

Tôi đã cố gắng để giải quyết cùng một vấn đề chính xác này, và như xa như Tôi biết, nó không thể được thực hiện. Đó là một con số thực.

Trong trường hợp của mình, tôi muốn chỉ định chú thích @Version, nơi có thể sử dụng bất kỳ liệt kê nào và giá trị enum có thể được so sánh theo thứ tự (để tìm thứ tự các phiên bản). Có vẻ như tôi cần phải làm những gì một số khung khác (như Guice tôi nghĩ) làm và sử dụng đôi để thay thế; bit xấu xí, nhưng hoạt động ok cho> = và < = kiểm tra.

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