类层次由于标签类

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

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

这样的标签类有许多缺点,充斥着样板代码,包括枚举,标签域以及条件语句。由于多个乱七八糟的实现挤在了一个类中,破坏了可读性。一句话总结标签类过于冗长,容易出错,并且效率低下。

好的处理方法——子类化类型

为了将标签类转化成类层次,首先要为标签类中的每个方法都定义一个包含抽象方法的抽象类。在上述类中只有一个这样的方法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;
    }
}

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

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

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,973评论 19 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,767评论 18 399
  • 1.ios高性能编程 (1).内层 最小的内层平均值和峰值(2).耗电量 高效的算法和数据结构(3).初始化时...
    欧辰_OSR阅读 29,615评论 8 265
  • 能在最脆弱的时候直击心灵的 能在最无奈的时候认清事实的 能在最头疼的时候让你更头疼的 永远是文字啊 羡慕
    heim_dn阅读 285评论 0 0
  • 上次大叔出门不愿带上我,回来一箩一箩的奇闻趣事,拨得我心痒痒的,这次大叔再出门,我死缠烂打,无论如何也要跟着去。大...
    翩翩新来燕阅读 384评论 6 7