1700446467
1700446468
Car是一个接口,完全合乎createCar方法的要求,所以它在编译时不会报任何错误,但一运行起来就会报InstantiationException异常。而使用枚举类型的工厂方法模式就不存在该问题了,不需要传递任何参数,只需要选择好生产什么类型的产品即可。
1700446469
1700446470
(2)性能好,使用便捷
1700446471
1700446472
枚举类型的计算是以int类型的计算为基础的,这是最基本的操作,性能当然会快,至于使用便捷,注意看客户端的调用,代码的字面意思就是“汽车工厂,我要一辆别克汽车,赶快生产”。
1700446473
1700446474
(3)降低类间耦合
1700446475
1700446476
不管生产方法接收的是Class、String还是int的参数,都会成为客户端类的负担,这些类并不是客户端需要的,而是因为工厂方法的限制必须输入的,例如Class参数,对客户端main方法来说,它需要传递一个FordCar.class参数才能生产一辆福特汽车,除了在create方法中传递该参数外,业务类不需要改Car的实现类。这严重违背了迪米特原则(Law of Demeter,简称为LoD),也就是最少知识原则:一个对象应该对其他对象有最少的了解。
1700446477
1700446478
而枚举类型的工厂方法就没有这种问题了,它只需要依赖工厂类就可以生产一辆符合接口的汽车,完全可以无视具体汽车类的存在。
1700446479
1700446480
注意 下一次,使用枚举来实现工厂方法模式。
1700446481
1700446482
1700446483
1700446484
1700446486
编写高质量代码:改善Java程序的151个建议 建议89:枚举项的数量限制在64个以内
1700446487
1700446488
为了更好地使用枚举,Java提供了两个枚举集合:EnumSet和EnumMap,这两个集合的使用方法都比较简单,EnumSet表示其元素必须是某一枚举的枚举项,EnumMap表示Key值必须是某一枚举的枚举项,由于枚举类型的实例数量固定并且有限,相对来说EnumSet和EnumMap的效率会比其他Set和Map要高。
1700446489
1700446490
虽然EnumSet很好用,但是它有一个隐藏的特点,我们逐步分析。在项目中一般会把枚举用作常量定义,可能会定义非常多的枚举项,然后通过EnumSet访问、遍历,但它对不同的枚举数量有不同的处理方式。为了进行对比,我们定义两个枚举,一个数量等于64,一个是65(大于64即可,为什么是64而不是128、512呢?稍后解释),代码如下:
1700446491
1700446492
//普通枚举项,数量等于64
1700446493
1700446494
enum Const{
1700446495
1700446496
A, B,C,……,PC, QC, RC;
1700446497
1700446498
}
1700446499
1700446500
//大枚举,数量超过64
1700446501
1700446502
enum LargeConst{
1700446503
1700446504
A, B,C,……,KB, LB, MB;
1700446505
1700446506
}
1700446507
1700446508
Const中的枚举项数量是64,LargeConst的数量是65,其中的……号代表省略的枚举项(注意此处只是省略了,Java不支持省略号)。接下来我们希望把这两个枚举转换为EnumSet,然后判断一下它们的class类型是否相同,代码如下:
1700446509
1700446510
public static void main(String[]args){
1700446511
1700446512
//创建包含所有枚举项的EnumSet
1700446513
1700446514
EnumSet<Const>cs=EnumSet.allOf(Const.class);
1700446515
1700446516
EnumSet<LargeConst>lcs=EnumSet.allOf(LargeConst.class);
[
上一页 ]
[ :1.700446467e+09 ]
[
下一页 ]