类层次优先于标签类

public class Figure{
    enum Shape {
        RECTANGLE,
        CIRCLE
    }
     
    // Tag field - the shape of this figure
    final Shape shape;
     
    // These field are use only if shape if RECTANGLE
    double length;
    double width;
     
    // This field is use only if shape is CIRCLE
    double radius;
     
    // Constructor for circle
    public Figure(double radius) {
        shape = Shape.CIRCLE;
        this.radius = radius;
    }
     
    // Constructor for rectangle
    public 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();
        }
    }
}

这种标签类的缺点

  1. 职责不唯一
  2. 可读性差
  3. 内存占用增加了
  4. 不能将length、width 、radius域设置为final
  5. 不利于扩展

总结就是一句话:标签类过于冗长、容易出错,并且效率低下

abstract class Figure {
    abstract double area();
}

class Circle extends Figure {
    final double radius;
    Circle(double radius) {
        this.radius = radius;
    }
    double area() {
        return Math.PI * radius * radius;
    }
}

class Rectangle extends Figure {
    final double length;
    final double width;
    Rectangle(double length, double width) {
        this.length = length;
        this.width = width;
    }
    double area() {
        return length * width;
    }
}

圆形与长方形的共同点在于都有计算面积的能力。
讲这种共同的能力放在根类Figure中。
如果还存在其他公用的属性,也应该放到该类中。
这种方式即为具有类层次。

类层次还有一个好处即可以反映类型之间本质的层次关系。
假如我们现在要加入一种正方形

class Square extends Rectangle {
    square(double side) {
        super(side, side);
    }
}

这种继承也可以反映现实中正方形属于长方形一种。

总而言之,标签类很少有适用的时候。当你想要编写一个包含显示的标签域的类时,应该考虑一下,这个标签是否可以被取消,这个类是否可以用类层次来代替,当你遇到一个包含标签域的现有类时,就要考虑将它重构到一个层次结构中去。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,206评论 19 139
  • 类与接口是Java语言的核心,设计出更加有用、健壮和灵活的类与接口很重要。 13、使类和成员的可访问性最小化 设计...
    Alent阅读 701评论 0 2
  • 转载请标明出处:http://www.aiuxian.com/article/p-1982467.html 接下来...
    lucky_yaya阅读 6,909评论 3 9
  • 记我的老师林少杰 时间在流逝,透窗的光线默默无声一格一格扫过画案上斑斑点点的羊毛毡,墨香氤氲又夹杂着淡淡的烟草气味...
    半山桃源阅读 882评论 2 3
  • 每个人对世界的认知都是不一样的,年龄越久越异。无可厚非,人与人存在诸多共性,所以交友,分享,相恋,甚至出书总结指导...
    行小远阅读 343评论 6 4