public class Figure{
enum Shape {
RECTANGLE,
CIRCLE
}
// Tag field - the shape of this figure
final Shape shape;
// These field are use only if shape if RECTANGLE
double length;
double width;
// This field is use only if shape is CIRCLE
double radius;
// Constructor for circle
public Figure(double radius) {
shape = Shape.CIRCLE;
this.radius = radius;
}
// Constructor for rectangle
public 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();
}
}
}
這種標(biāo)簽類的缺點(diǎn)
- 職責(zé)不唯一
- 可讀性差
- 內(nèi)存占用增加了
- 不能將length歼冰、width 、radius域設(shè)置為final
- 不利于擴(kuò)展
總結(jié)就是一句話:標(biāo)簽類過于冗長(zhǎng)耻警、容易出錯(cuò)隔嫡,并且效率低下
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;
}
}
圓形與長(zhǎng)方形的共同點(diǎn)在于都有計(jì)算面積的能力。
講這種共同的能力放在根類Figure中甘穿。
如果還存在其他公用的屬性腮恩,也應(yīng)該放到該類中。
這種方式即為具有類層次温兼。
類層次還有一個(gè)好處即可以反映類型之間本質(zhì)的層次關(guān)系庆揪。
假如我們現(xiàn)在要加入一種正方形
class Square extends Rectangle {
square(double side) {
super(side, side);
}
}
這種繼承也可以反映現(xiàn)實(shí)中正方形屬于長(zhǎng)方形一種。
總而言之妨托,標(biāo)簽類很少有適用的時(shí)候缸榛。當(dāng)你想要編寫一個(gè)包含顯示的標(biāo)簽域的類時(shí)吝羞,應(yīng)該考慮一下,這個(gè)標(biāo)簽是否可以被取消内颗,這個(gè)類是否可以用類層次來代替钧排,當(dāng)你遇到一個(gè)包含標(biāo)簽域的現(xiàn)有類時(shí),就要考慮將它重構(gòu)到一個(gè)層次結(jié)構(gòu)中去。