第15條 :要么專門為繼承而設計,并給出文檔說明,要么禁止繼承
? 為了允許繼承,一個類必須遵守如下約定:
? 構造函數一定不能調用可被改寫的方法。
第16條:接口優于抽象類
? 接口通常是定義具有多個實現的類型的最佳途徑。
? 例外情形是當演化的容易性被靈活性和功能更為重要的時候。這時應該使用抽象類來定義類型。
? 如果導出了一個重要接口,應該考慮同時提供一個骨架實現類(skeletal implementation class)
? 盡可能謹慎設計所有的公有接口,并編寫多個實現來測試它們。
第17條:接口是用于定義類型的
? 接口應該這是被用來定義類型的
? 常量接口模式是對接口的不良使用
如果需要導出常量,應該使用類型安全枚舉類,如
public class PhysicalConstants{
private PhysicalConstants(){}//注意:構造函數應該是私有的,避免子類化
public static final AVOCADROS_NUMBER = .....;//注意,常量類型應該是static final的
}
第18條:優先考慮靜態成員類
? 嵌套類有四種:靜態成員類,非靜態成員類,匿名類,局部類
? 非靜態成員類的一種通用用法:允許外部類的一個實例被看做另一個不相關的類的實例。
例如,諸如Set和List這樣的集合接口的實現往往使用非靜態成員類來實現他們的迭代器
public class MySet extends AbstractSet {
public Iterator iterator(){
return new MyIterator();
}
public class MyIterator implements Iterator{
................
}
}
? 如果聲明的成員類不要求訪問外圍實例,那么使用static修飾符使它成為靜態成員類。