1700446725
1700446726
public Color getColor(){
1700446727
1700446728
return color;
1700446729
1700446730
}
1700446731
1700446732
}
1700446733
1700446734
//鸟巢,工厂方法模式
1700446735
1700446736
enum BirdNest{
1700446737
1700446738
Sparrow;
1700446739
1700446740
//鸟类繁殖
1700446741
1700446742
public Bird reproduce(){
1700446743
1700446744
Desc bd=Sparrow.class.getAnnotation(Desc.class);
1700446745
1700446746
return bd==null?new Sparrow():new Sparrow(bd.c());
1700446747
1700446748
}
1700446749
1700446750
}
1700446751
1700446752
程序比较简单,声明了一个Bird抽象类,并且标注了Desc注解,描述鸟类的颜色是白色的,然后编写了一个麻雀Sparrow类,它有两个构造函数,一个是默认的构造函数,也就是我们经常看到的麻雀是浅灰色的,另外一个构造函数是自定义麻雀的颜色,之后又定义了一个鸟巢(工厂方法模式),它是专门负责鸟类繁殖的,它的生产方法reproduce会根据实现类注解信息生成不同颜色的麻雀。我们编写一个客户端调用,代码如下:
1700446753
1700446754
public static void main(String[]args){
1700446755
1700446756
Bird bird=BirdNest.Sparrow.reproduce();
1700446757
1700446758
Color color=bird.getColor();
1700446759
1700446760
System.out.println(“Bird’s color is:”+color);
1700446761
1700446762
}
1700446763
1700446764
现在的问题是这段客户端程序会打印出什么来?因为采用了工厂方法模式,它最主要的问题就是bird变量到底采用了哪个构造函数来生成,是无参构造还是有参构造?如果我们单独看子类Sparrow,它没有被添加任何注解,那工厂方法中的bd变量就应该是null了,应该调用的是无参构造。是不是如此呢?我们来看运行结果:
1700446765
1700446766
Bird’s color is:White
1700446767
1700446768
白色?这是我们添加到父类Bird上的颜色,为什么?就是因为我们在注解上加了@Inherited注解,它表示的意思是我们只要把注解@Desc加到父类Bird上,它的所有子类都会自动从父类继承@Desc注解,不需要显式声明,这与Java类的继承有点不同,若Sparrow类继承了Bird,则必须使用extends关键字声明,而Bird上的注解@Desc继承自Bird却不用显式声明,只要声明@Desc注解是可自动继承的即可。
1700446769
1700446770
采用@Inherited元注解有利有弊,利的地方是一个注解只要标注到父类,所有的子类都会自动具有与父类相同的注解,整齐、统一而且便于管理,弊的地方是单单阅读子类代码,我们无从知道为何逻辑会被改变,因为子类没有明显标注该注解。总体上来说,使用@Inherited元注解的弊大于利,特别是一个类的继承层次较深时,如果注解较多,则很难判断出是哪个注解对子类产生了逻辑劫持。
1700446771
1700446772
1700446773
1700446774
[
上一页 ]
[ :1.700446725e+09 ]
[
下一页 ]