第二十條:類層次由於標籤類

一、什麼叫做標籤類

標籤類指的是:類中由某個或某組常量(這就是標籤),控制着這個類的行爲。
示例:
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();
	}
這樣最容易體現類層次。

所以標籤類是一種很糟糕的編碼方式。


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