Effective Java 學習筆記(20)

類層次要優於標籤類。

 

所謂標籤類是指含有多個功能類,如下。

 

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

 

 

裏面即有CIRCLE, 又含有RECTANGLE, 使得結構太複雜,很容易在switch case時少判斷了一種情況導致程序出錯。不便於維護。而採用類層次結構可以避免這個問題。

 

 

// Class hierarchy replacement for a tagged class
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; }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章