第39條 注解優(yōu)先于命名模式
Java 1.5之前拥峦,一般使用命名模式(naming pattern)表明有些程序元素需要通過某種工具或者框架進(jìn)行特殊處理。比如方法的前綴名同一用"test"等等
-
@Repeatable
可以讓一個(gè)注解在同一個(gè)元素上多次使用:@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) @Repeatable(AnnotationTwo.class) public @interface AnnotationOne { Class<? extends Exception> value(); } @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface AnnotationTwo { AnnotationOne[] value(); } public class Text { @AnnotationOne(RuntimeException.class) @AnnotationOne(NullPointerException.class) public void testTwoAnnotationMethod() { } @AnnotationOne(NullPointerException.class) public void testOneAnnotationMethod() { } }
使用
@Repeatable
注解的輔佐用就是灵巧,當(dāng)重復(fù)使用一個(gè)注解之后,就會(huì)變成@Repeatable
注解里面配置的那個(gè)注解public static void main(String[] args) { Class<Text> clazz = Text.class; Method[] methods = clazz.getMethods(); for (Method method : methods) { if (!method.getName().startsWith("test")) { continue; } System.out.println(method.getName()); System.out.println(method.isAnnotationPresent(AnnotationOne.class)); } }
這個(gè)的執(zhí)行結(jié)果是:
false true
抹沪,@AnnotationOne
在一個(gè)方法上重復(fù)使用之后變成了@AnnotationTwo
刻肄,不過method.getAnnotationsByType(AnnotationOne.class)
還是會(huì)返回兩個(gè)的 有了注解就沒有必要使用命名模式了
都應(yīng)該使用Java平臺(tái)所提供的與定義的注解類型
思考
- 注解主要是框架的時(shí)候會(huì)用到,業(yè)務(wù)代碼里很少會(huì)碰到
-
@Repeatable
注解個(gè)人感覺副作用更多融欧,使用的時(shí)候還需要每一個(gè)地方都判斷出現(xiàn)了一次多次敏弃,讓代碼的復(fù)雜度提高了