Java dopuszcza wartości enum
jako wartości adnotacji. Jak zdefiniować rodzaj ogólnej domyślnej wartości enum
dla wartości adnotacji enum
?Wartość domyślna wyliczenia dla wartości adnotacji wyliczeniowej Java
Rozważałam dodaje, ale nie będzie skompilować:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public <T extends Enum<T>> @interface MyAnnotation<T> {
T defaultValue();
}
Czy istnieje rozwiązanie tego problemu, czy nie?
BOUNTY
nie wydaje się to jak istnieje bezpośredni rozwiązanie tego przypadku narożnego Java. Tak więc zaczynam nagrodę, aby znaleźć najbardziej eleganckie rozwiązanie tego problemu.
Rozwiązanie idealny powinny idealnie spełniać następujące kryteria:
- Jeden adnotacja wielokrotnego użytku na wszystkich teksty stałe
- Minimalny wysiłek/złożoność pobrać wartość domyślną enum jako enum od przypadkach adnotacji
NAJLEPSZE ROZWIĄZANIE TAK DUŻE
wydm:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface MyAnnotation {
// By not specifying default,
// we force the user to specify values
Class<? extends Enum<?>> enumClazz();
String defaultValue();
}
...
public enum MyEnumType {
A, B, D, Q;
}
...
// Usage
@MyAnnotation(enumClazz=MyEnumType.class, defaultValue="A");
private MyEnumType myEnumField;
Oczywiście, nie możemy zmusić użytkownika, aby określić prawidłową wartość domyślną w czasie kompilacji. Jednak każde wstępne przetwarzanie adnotacji może to sprawdzić za pomocą valueOf()
.
POPRAWA
Arian zapewnia eleganckie rozwiązanie, aby pozbyć się clazz
w adnotacjami dziedzinach:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface MyAnnotation {
}
...
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@MyAnnotation()
public @interface MyEnumAnnotation {
MyEnumType value(); // no default has user define default value
}
...
@MyEnumAnnotation(MyEnum.FOO)
private MyEnumType myValue;
Procesor adnotacja powinna szukać zarówno MyEnumAnnotation
na polach podanej wartości domyślnej.
Wymaga to utworzenia jednego typu adnotacji na typ wyliczeniowy, ale gwarantuje kompilację typu sprawdzanie czasu bezpieczeństwa.
Czy nie byłoby to bezsensowne? Kiedykolwiek przejdziesz do przetwarzania adnotacji w czasie wykonywania, informacje ogólne zostaną utracone. – Dunes
Unikałoby to konieczności definiowania jednej adnotacji na typ enum do użycia w moim kodzie (jest to problem czasu kompilacji). – JVerstry
Nie miałem na myśli, że pomysł nie jest przydatny. Ale generyczne są znane tylko podczas kompilacji. Masz zaznaczone adnotacje, które mają zostać zachowane w środowisku wykonawczym. Ale aby uzyskać dostęp do adnotacji, musisz przejść przez refleksję - nie miałbyś pojęcia, jaki pierwotnie był typ generyczny. – Dunes