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/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    [转]关于ORA00979 不是 GROUP BY 表达式错误的解释
    【转】mongodb简介及源码编译安装mongo2.0.0服务器
    mysql 缓存(转)
    iostat命令详解(转)
    C++虚函数,纯虚函数,抽象基类,虚基类(转)
    C++虚类的作用(转)
    C++ 纯虚类(转)
    虚函数的应用特性(转)
    2、Linux多线程,线程的分离与结合(转)
    mongodb js shell不能使用退格键的问题(转)
  • 原文地址:https://www.cnblogs.com/haokaibo/p/prefer-class-hierarchies-to-tagged-classes.html
Copyright © 2011-2022 走看看