第二十条:类层次由于标签类

一、什么叫做标签类

标签类指的是:类中由某个或某组常量(这就是标签),控制着这个类的行为。
示例:
public class Figure {
	//枚举类型
	enum Shape{SQUARE,CIRCLE};
	
	private double radium;
	private double width;
	private double height;
	private Shape type;
	
	public Figure(double radium){
		type = Shape.CIRCLE;
		this.radium = radium;
	}
	
	public Figure(double width,double height){
		type = Shape.SQUARE;
		this.width = width;
		this.height = height;
	}
	
	public double area(){
		//需要进行判断返回数据
		switch (type) {
		case CIRCLE:
			return radium*Math.PI*2;
		case SQUARE:
			return width*height;
		default:
			throw new IllegalArgumentException("未知错误");
		}
	}
}
二、标签类的缺点
①、容易产生数据冗余,就像例子中的area()方法,需要进行类型判断才能返回值,如果数据一多就需要进行大量的判断,整个类的可读性太低。
②、类型不清晰,比如说我用到了这个类的构造方法,我怎么知道我返回的面积是Circle还是Square。
综上,标签类唯一的优点是,能够少创建类。

三、如何改进标签类
标签类,其实就是将类此层结构包装在了一个类中,我们只需要还原它的类层级接口就可以了。
首先:父类:Figure     子类:Square() 、Circle()
①、创建父类
public interface Figure {
	double area();
}
②、子类继承父类(Square为例)
public class Square implements Figure {
	private final double width;
	private final double height;
	
	public Square(double width,double height) {
		// TODO Auto-generated constructor stub
		this.width = width;
		this.height = height;
	}
	
	
	@Override
	public double area() {
		// TODO Auto-generated method stub
		return width*height;
	}
}
使用:
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Figure figure = new Square(10, 10);
		double area = figure.area();
	}
这样最容易体现类层次。

所以标签类是一种很糟糕的编码方式。


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