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

类层次优先于标签类

作者: KubiL | 来源:发表于2017-05-23 00:15 被阅读0次
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);
    }
}

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

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

相关文章

  • 类层次优先于标签类

    这种标签类的缺点 职责不唯一 可读性差 内存占用增加了 不能将length、width 、radius域设置为fi...

  • 第 23 条:类层次优先与标签类

    标签类 类层次

  • 类层次由于标签类

    有时候,可能会遇到带有两种甚至更多种分格的实例的类,并包含标识实例分格的标签域,举个栗子 这样的标签类有许多缺点,...

  • 提示二十三

    今天来看提示二十三: 类层次优于标签类。 作者使用了Figure的例子说明了标签类是那种拥有多种风格实例,通过标签...

  • 无标题文章

    聚类方法整理 标签(空格分隔): 算法学习 聚类算法大类 1. K-Mean 2. 层次聚类算法 3. SOM聚类...

  • load & initialize

    load 方法父类先于子类执行 load 方法主类先于分类执行 相同主类多个分类均有 load 方法会受到编译顺序...

  • 数据挖掘

    数据立方体,最小内存计算 层次聚类 首先介绍聚类中的层次聚类算法。层次法又分为凝聚的层次聚类和分裂的层次聚类。 凝...

  • Kmeans笔记

    训练过程中,没有标签,属于无监督学习。 层次聚类有包含关系,非层次聚类没有包含关系 举个例子:外部评价方法:有1亿...

  • R 实现聚类分析_07Jul2020

    聚类分析 层次聚类 kmeans 使用eclust进行kmeans聚类或层次聚类

  • 类标签

    header(页眉) Banner轮播 footer(页尾) nav(导航) article(独立的文章内容) s...

网友评论

    本文标题:类层次优先于标签类

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