博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
第20条:类层次优先于标签类
阅读量:6545 次
发布时间:2019-06-24

本文共 1449 字,大约阅读时间需要 4 分钟。

标签类值带有两种甚至多种风格的实例的类,如一个表示圆或者矩形的类:

class Figure {    enum Shape { RECTANGLE, CIRCLE };    final Shape shape;    double length;    double width;    double radius;        Figure(double radius) {        shape = Shape.CIRCLE;        this.radius = radius;    }    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();        }    }}

这种标签类过于冗长,容易出错,并且效率低下。

 

在Figure类中,只有area方法是矩形或者圆都有的,将它放在类层次的根。

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;    }}

类层次可以反映正方形是一种特殊的矩形:

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

上述的域是被直接访问的,而不是通过访问方法,应该使用访问方法。

 

标签类很少适用的时候,当想要编写一个包含显式标签域的类时,考虑能否用类层次代替,当遇到一个包含标签域的现有类时,考虑将它重构到一个层次结构中。

转载于:https://www.cnblogs.com/13jhzeng/p/5709127.html

你可能感兴趣的文章
Java 线程 — ThreadLocal
查看>>
安居客爬虫(selenium实现)
查看>>
-----二叉树的遍历-------
查看>>
ACM北大暑期课培训第一天
查看>>
F. Multicolored Markers(数学思维)
查看>>
nodjs html 转 pdf
查看>>
Python字典
查看>>
Android存储方式之SQLite的使用
查看>>
洛谷P1287 盒子与球 数学
查看>>
Bootstrap vs Foundation如何选择靠谱前端框架
查看>>
与、或、异或、取反、左移和右移
查看>>
vue常用的指令
查看>>
matlab练习程序(随机游走图像)
查看>>
Linux命令行下运行java.class文件
查看>>
input文本框实现宽度自适应代码实例
查看>>
protocol buffers的编码原理
查看>>
行为型设计模式之命令模式(Command)
查看>>
减少死锁的几个常用方法
查看>>
HDFS 核心原理
查看>>
正确配置jstl的maven依赖,jar包冲突的问题终于解决啦
查看>>