2009-06-24 21 views
15

Ben başlık altında JGoodies Binding kullanan Java Swing için bir açıklama tabanlı bağlama-çerçeve geliştiriyorum. Ne yazık ki bir JRadioButton-binding için bir ek açıklama ile sıkışmış. Yapmak istediğim, özel bir değeri (enum) tutan bir modelin özellik adını belirtmek. Bu özellik belirli bir değere sahipse, radyo düğmesi seçilmelidir. Şimdi böyle ek açıklamada değerini belirtmek istiyorum:* Herhangi bir * enum için bir açıklama özelliği bildirmenin bir yolu var mı? Şu anda

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

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

Ancak, ben de herhangi diğer enum yukarıda ve izin şerh ilan etmek nasıl bilmiyorum. Benim ilk tahminim bu, ama açıklama nitelikleri jenerik olamayacağını öğrendik:

@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(); 

} 

Herhangi fikirleri nasıl bu çözmek için?

+0

burada listelenen RadioButtonBinding açıklama iki fikri içerir: Birincisi Enum sınıf ve ondan kullanılacak sabit dize belirtmektir. Ancak bu elbette güvenli değildir ve RuntimeExceptions'a yol açabilir. İkincisi, bir enum değerini doğrudan belirtmektir, ancak bu işe yaramaz. –

+0

btw JGoodies ile bu türden pek çok şey yaptım, Java'da yaşadığım en sefil zamanlardan biri. En büyük sorun o geçirilen "taban" sınıfı, belirli bir örneği ama olmalı onun diğer sınıfların çoğu genişletmek ve bu yüzden onun yöntemleri yöntemi (baz, baz, baz) gibi imzaya sahip bir "temel" sınıfı, sahip olmasıdır imza, hangi sınıfın bir örneği olması gerektiği konusunda hiçbir ipucu vermez. Bağlayıcılar bölümü iyi bir fikirdi, ama o zamanlar (yıllar önce) iyi bir şekilde desteklemedi ve tamamlanmamıştı ve sadece Almanca olarak belgelendi. –

cevap

3

O siz istediğiniz şekilde çalışması için gitmiyor. Öğrendiğiniz gibi, ek açıklamalarda yalnızca basit dönüş türlerini kullanabilirsiniz. Ayrıca, dizgeyi kötüye kullanma gibi şeyler yaparak bu kısıtlamaların üstesinden gelmeye çalışmak, notunuzun değerlerini sıfırlamak için sabit bir ifade kullanmanız gerektiğinden çalışmayacaktır.

Sana alacaksın yakın ENUM adı ile karşılaştırmak için kodu kullanın sonra() String ile initialize ve olduğunu düşünüyorum. Ama, bu soruyu yararlı bulabilirsiniz senin tipin güvenlik ...

1

sizin çeteleler hepsi aynı arabirim uygulayabilen Eğer gidiyor "Coding tip - intersection types and java enums"

+0

Ne yazık ki değil, ama yine de bahşiş için teşekkürler. –

+0

Bu ortak arabirimi tam olarak bir ek açıklama niteliğinde nasıl kullanırsınız? ' & MyInterface> T enumValue() öğesini genişletir;' arabirim olmadan daha iyi çalışmaz. – Imre

0

Bu tam aynı sorunu çözmek için çalışıyor ve kadarıyla edildi Biliyorum, bu yapılamaz. Bu gerçek bir serseri. Benim durumumda

, herhangi numaralandırma kullanılabilir @version ek açıklama, belirtmek istedim ve numaralandırma değerleri ile karşılaştırılabilir sıra (sürümleri sıralamasını bulmak için). Görünüşe göre diğer bazı çerçeveler (sanırım Guice gibi) yapmak yerine iki misli kullanmalıyım; biraz çirkin, ama> = ve < = çek için tamam çalışıyor.

İlgili konular