Java允許enum
作爲註釋值的值。如何爲enum
註釋值定義一種通用默認enum
值?Java枚舉註釋值的枚舉默認值
我已經考慮了以下,但它不會編譯:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public <T extends Enum<T>> @interface MyAnnotation<T> {
T defaultValue();
}
是否有這個問題的解決與否?
BOUNTY
是似乎並不像有一個直接的解決方案,這個Java角落的情況。所以,我開始尋找解決這個問題的最優雅解決方案。
的理想解決方案應該理想滿足以下條件:在所有枚舉
- 一個註解重複使用
- 最小的努力/複雜檢索默認枚舉值從註釋實例枚舉
SO OF FAR
沙丘:
@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;
當然,我們也不能強制用戶在編譯時指定一個有效的默認值。但是,任何註釋預處理都可以使用valueOf()
進行驗證。
改進
阿里安提供了一個完美的解決方案,以在註釋字段擺脫clazz
:
@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;
註解處理器應該尋找既MyEnumAnnotation
上提供的默認值的字段。
這需要爲每個枚舉類型創建一個註釋類型,但是保證編譯時間檢查類型的安全性。
難道這不是毫無意義嗎?每當你在運行時處理註解時,通用信息就會丟失。 – Dunes
這將避免我必須爲每個枚舉類型定義一個註釋,以便在代碼中使用(這是編譯時問題)。 – JVerstry
我不是故意沒有用。但是泛型只在編譯時才知道。您已將註釋標記爲保留在運行時中。但要訪問註釋,你必須通過思考 - 你不會有任何想法是什麼泛型類型。 – Dunes