Java 8之前,同一注解不能在相同的目標(biāo)元素上多次使用,例如,如下的注解在Java 8之前是不允許的:
public class SampleClass {
@Quality("Security")
@Quality("Performance")
@Quality("Readability")
public void foo(){
//
}
}
Java 8引入了Repeatable注解(@Repeatable)可以解決這一問(wèn)題,但光有可重復(fù)的注解定義還不夠,還需要它的容器注解,兩者一起來(lái)實(shí)現(xiàn)可重復(fù)注解的使用。實(shí)例如下:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
@Repeatable (Qualities.class)
public @interface Quality {
String value();
}
@Target(ElementType.METHOD)
public @interface Qualities {
Quality[] value();
}
其中,Quality是可重復(fù)注解,由@Repeatable注解標(biāo)明,它的容器注解是Qualities,用于存放所有可重復(fù)的Quality(存貯在Quality[]中);同時(shí)還要注意可重復(fù)注解和它的容器注解的目標(biāo)元素必須是一樣的(這也不言自明)。如此這般,我們最開(kāi)始的
SampleClass 在Java 8環(huán)境下就可以安全使用了。
以下單例實(shí)現(xiàn)思想來(lái)自《Java Design Patterns: A Programmer's Approach》.
該方法利用了Java缺省的Lazy類(lèi)實(shí)例化機(jī)制克服了傳統(tǒng)單例模式實(shí)現(xiàn)中Lazy實(shí)例化方式的不足。
public class Singleton {
private Singleton(){}
public static Singleton getInstance(){
return Helper.instance;
}
static class Helper {
private static Singleton instance = new Singleton();
}
}