zoukankan      html  css  js  c++  java
  • Effective Java 20 Prefer class hierarchies to tagged classes

    Disadvantage of tagged classes

    1. Verbose (each instance has unnecessary irrelevant fields).

    2. Error-prone (Program will fail by initializing wrong fields).

    3. Inefficient (Memory footprint is increased for not used field).

       

    /**

    * Tagged class - vastly inferior to a class hierarchy!

    * @author Kaibo

    */

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

    }

    }

    }

       

    /*

    * Refined with Hierarchies

    */

    /**

    * Class hierarchy replacement for a tagged class

    * @author Kaibo

    */

    abstract class Figure {

    abstract double area();

    }

       

    public class Rectangle extends Figure {

    // specific fields

    final double length;

    final double width;

    Rectangle(double length, double width) {

    this.length = length;

    this.width = width;

    }

       

    /*

    * Common methods

     

    * @see com.effectivejava.classinterface.Figure#area()

    */

    @Override

    double area() {

    return length * width;

    }

    }

       

    public class Circle extends Figure { 

    /**

    * specific fields.

    */

    final double radius;

    Circle(double radius) {

    this.radius = radius;

    }

    /*

    * common method

    * @see com.effectivejava.classinterface.Figure#area()

    */

    @Override

    double area() {

    return Math.PI * (radius * radius);

    }

    }

    Summary

    If you're tempted to write a class with an explicit tag field, think about whether the tag could be eliminated and the class replaced by a hierarchy. When you encounter an existing class with a tag field, consider refactoring it into a hierarchy.

       

    作者:小郝
    出处:http://www.cnblogs.com/haokaibo/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    errorC4430解决办法(vs2013)
    c++获取系统当前时间写入txt文件
    黑苹果安装记录(史上最简单的安装教程——小白福利)
    运行vs生成的exe出现应用程序无法正常启动(0x000007b)解决方案(亲测有效)
    数据可视化工具grafans,忘记密码恢复默认admin(基本使用教程)
    opencv任意形状角度透视变换(代码分析清晰)
    opencv两张规格一样的图片拼接(纵向和横向)
    linux3
    linux2
    linux1
  • 原文地址:https://www.cnblogs.com/haokaibo/p/prefer-class-hierarchies-to-tagged-classes.html
Copyright © 2011-2022 走看看