學習effective java-20類和接口之類層次優於標籤類

 

 該知識點是自己從書籍中學習的筆記。

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;

   }

}

當需要增加一個形狀的時候,僅僅是增加一個子類,對於子類的屬性僅僅賦給子類就可以了。閱讀性也好。

當然,標籤類也不是不好,在某些類的屬性和子類已經固定,並且子類不多的時候就可以使用標籤類來實現。

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