該知識點是自己從書籍中學習的筆記。
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;
}
}
當需要增加一個形狀的時候,僅僅是增加一個子類,對於子類的屬性僅僅賦給子類就可以了。閱讀性也好。
當然,標籤類也不是不好,在某些類的屬性和子類已經固定,並且子類不多的時候就可以使用標籤類來實現。