学习effective java-20类和接口之类层次优于标签类

来源:互联网 发布:我的世界java安装 编辑:程序博客网 时间:2024/04/30 13:32
 

 该知识点是自己从书籍中学习的笔记。

1.标签类是指类中定义了一个变量,使用该变量的值控制着该做什么动作。如下:

public class Figure {

   enum Shape {

      RECTANGLE, CIRCLE

   };

 

   final Shape shape;

   double height;

   double width;

   double radious;

 

   public Figure(double radious) {

      this.shape = Shape.CIRCLE;

      this.radious = radious;

   }

 

   public Figure(double height,double width) {

      this.shape = Shape.RECTANGLE;

      this.width = width;

      this.height = height;

   }

 

   public double area() {

      switch (shape) {

      case CIRCLE:

        return Math.PI * radious * radious;

      case RECTANGLE:

        return width * height;

      default:

        throw new AssertionError();

      }

   }

 

}

上面就是一个标签类,该类设计的并不好,该类的阅读性不好。当用户需要创建Circle对象,然后获取面积的时候,会通过标签变量shape来进行判断。如果后面再增加一个多边形的时候,那么该类的Enum就需要增加个多边形的枚举值,同时area方法也需要修改,该类还需要增加构造方法和成员变量。这样长之以往,会导致该类无限增大,性能会降低。

2.鉴于上面的问题,所以可以使用类层次来修改上述代码,如下:

abstract class Figure1 {

   abstract double area();

}

 

class Circle extends Figure1 {

   private double radious;

 

   public Circle(double radious) {

      this.radious = radious;

   }

 

   @Override

   double area() {

      return Math.PI * radious * radious;

   }

}

 

class Rectangle extends Figure1 {

   private double height;

   private double width;

 

   public Rectangle(double height,double width) {

      this.height = height;

      this.width = width;

   }

 

   @Override

   double area() {

      return height * width;

   }

}

当需要增加一个形状的时候,仅仅是增加一个子类,对于子类的属性仅仅赋给子类就可以了。阅读性也好。

当然,标签类也不是不好,在某些类的属性和子类已经固定,并且子类不多的时候就可以使用标签类来实现。

原创粉丝点击