所谓标签类,指的是一个类中充斥着许多样板代码,下面这个就是典型的标签类
public class Figure1{
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 Figure1(double radius) {
shape = Shape.CIRCLE;
this.radius = radius;
}
// Constructor for rectangle
public Figure1(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();
}
}
}
这种写法毫无疑问问题是很大的,正确的写法应该将其转化成类层次
abstract class Figure1
{
abstract double area();
class Circle extends Figure1
{
final double radius;
Circle(double radius)
{
this.radius = radius;
}
@Override
double area()
{
return Math.PI * (radius * radius);
}
}
class Rectangle extends Figure1
{
final double length;
final double width;
Rectangle(double length, double width)
{
this.length = length;
this.width = width;
}
@Override
double area()
{
return width * length;
}
}
}
简而言之,标签类很少有适用的时候。当你想编写一个包含显式标签域的类时,应该考虑一下,这个标签是否可以被取消,这个类是否可以用类层次来代替。当你遇到一个包含标签域的现有类时,就要考虑将它重构到一个类层次结构中去。