美文网首页
Effective Java - 类层次优于标签类

Effective Java - 类层次优于标签类

作者: DZQANN | 来源:发表于2022-06-07 21:29 被阅读0次
    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原则的话,更好的是拆分这个类

    相关文章

      网友评论

          本文标题:Effective Java - 类层次优于标签类

          本文链接:https://www.haomeiwen.com/subject/ebcpmrtx.html