Effective Java - 类层次优于标签类
2022-06-07 本文已影响0人
DZQANN
-
标签类是指将本来应该的子类全部放到一个父类中,通过一个标签标记当前类是哪种子类。
class Figure { enum Shape { RECTANGLE, CIRCLE }; // Tag field - the shape of this figure final Shape shape; // These fields are used only if shape is RECTANGLE double length; double width; // This field is used only if shape is CIRCLE double radius; // Constructor for circle Figure(double radius) { shape = Shape.CIRCLE; this.radius = radius; } // Constructor for rectangle Figure(double length, double width) { shape = Shape.RECTANGLE; this.length = length; this.width = width; } double area() { switch(shape) { case RECTANGLE: return length * width; case CIRCLE: return Math.PI * (radius * radius); default: throw new AssertionError(shape); } } }
-
标签类的缺点:
- 充斥着样板代码,包括枚举声明,标签域以及条件语句,可读性不好
- 因为类里面有大量其它标签的代码,创建的实例相对的内从占用会增加
- 增加一种标签就需要改动文件
- 不容易扩展
-
标签类应该由继承关系替代
- 定义抽象基类,方法行为若依赖于标签值,则定义为抽象方法。方法行为若不依赖于标签值,就把方法放在抽象类中
- 所有方法都用到的数据域放在抽象类中,特定于某个类型的数据域放在对应的子类中
思考
- 标签类的缺点非常的明显。同时也提醒我们,如果有很多的
if
或者switch
判断,应该考虑使用策略模式去掉判断,代码更加简洁 - 这个例子不是很好,这个例子更好的应该是用接口,而不是抽象类。如果加了
Square
可以继承Rectangle
- 占用内存虽然不是那么严重,也可以提醒我们,如果遇到了一个类非常的长,但是一次只会调用其中的一部分代码的话。要不拆分这个类,要不做成单例的。按照标准可能是变成单例,按照符合OOP原则的话,更好的是拆分这个类