Effective Java - 类层次优于标签类

2022-06-07  本文已影响0人  DZQANN
  1. 标签类是指将本来应该的子类全部放到一个父类中,通过一个标签标记当前类是哪种子类。

    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);
            }
        }
    }
    
  2. 标签类的缺点:

    • 充斥着样板代码,包括枚举声明,标签域以及条件语句,可读性不好
    • 因为类里面有大量其它标签的代码,创建的实例相对的内从占用会增加
    • 增加一种标签就需要改动文件
    • 不容易扩展
  3. 标签类应该由继承关系替代

    • 定义抽象基类,方法行为若依赖于标签值,则定义为抽象方法。方法行为若不依赖于标签值,就把方法放在抽象类中
    • 所有方法都用到的数据域放在抽象类中,特定于某个类型的数据域放在对应的子类中

思考

  1. 标签类的缺点非常的明显。同时也提醒我们,如果有很多的if或者switch判断,应该考虑使用策略模式去掉判断,代码更加简洁
  2. 这个例子不是很好,这个例子更好的应该是用接口,而不是抽象类。如果加了Square可以继承Rectangle
  3. 占用内存虽然不是那么严重,也可以提醒我们,如果遇到了一个类非常的长,但是一次只会调用其中的一部分代码的话。要不拆分这个类,要不做成单例的。按照标准可能是变成单例,按照符合OOP原则的话,更好的是拆分这个类
上一篇下一篇

猜你喜欢

热点阅读