標籤類值帶有兩種甚至多種風格的例項的類,如乙個表示圓或者矩形的類:
classfigure ;
final
shape shape;
double
length;
double
width;
double
radius;
figure(
double
radius)
figure(
double length, double
width)
double
area()
}}
這種標籤類過於冗長,容易出錯,並且效率低下。
在figure類中,只有area方法是矩形或者圓都有的,將它放在類層次的根。
abstractclass
figure
class circle extends
figure
double
area()
}class rectangle extends
figure
double
area()
}
類層次可以反映正方形是一種特殊的矩形:
class square extendsrectangle
}
上述的域是被直接訪問的,而不是通過訪問方法,應該使用訪問方法。
標籤類很少適用的時候,當想要編寫乙個包含顯式標籤域的類時,考慮能否用類層次代替,當遇到乙個包含標籤域的現有類時,考慮將它重構到乙個層次結構中。
第16條 復合優先於繼承
這裡的繼承是實現繼承而非介面繼承。與方法呼叫不同的是,繼承打破了封裝性 換句話說,子類依賴於其超類中特定功能的實現細節。超類的實現有可能會隨著髮型版本的不同而發生改變,如果真的發生了變化,子類可能會遭到破壞,即使他的 完全沒有改變。因此,子類必須跟著超類的更新而改變,除非超類是專門為擴充套件而設計的...
第25條 列表優先於陣列
陣列與泛型相比,有兩個重要的不同點。陣列是協變的 如果sub是super的子型別,那麼陣列型別sub是super的子型別 相反,泛型是不可變得,對於任意兩個不同的型別t1和t2,list和list沒有子型別或超型別的關係。這段 在執行時出錯 object o new long 1 o 0 i don...
第四章 類和介面 第16條 復合優先於繼承
本條目討論的問題並不適用於介面繼承 與方法呼叫不同的是,繼承打破了封裝性,如果超類中特定功能的實現細節發生了變化,子類可能會遭到破壞,即使它的 完全沒有改變,除非超類是專門為了擴充套件而設計的,並且有很好文件說明 例項 public class instrumentedhashsetextends ...