1、用靜態工廠方法代替構造器
優點:有自己的方法名,見名知其意;不用重復創建對象,類似單利模式中的餓漢式。
缺點:公有靜態方法返回的非公有類不能被實例化;查找API麻煩。
2、遇到多個構造器參數時要考慮使用構建器
參數很多時,使用構建器模式便於閱讀。
3、用私有構造器或者枚舉類型強化Singleton屬性
單例是線程安全的。
4、通過私有構造器強化不可實例化的能力
有的工具類進行實例化無意義,將其構造方法私有化。
5、優先考慮依賴注入來引用資源
6、避免創建不必要的對象
String str = "hello"; jdk7后,str字符串的創建是在堆內存。
7、消除過期的對象引用
過期引用會造成內存泄漏?
解決方法:將不再使用的元素置為null。
8、避免使用終結方法和清除方法
FileInputStream源碼中實現了終結方法,優點在於如果忘記close()方法,會執行終結方法。
9、覆蓋equals時請遵守通用約定
覆蓋equals方法時,遵守約定:自反性,對稱性,傳遞性,一致性,對於任何非null的引用值x,x.equals(null)必須返回false。
instanceof是類型比較,例如 A instanceof B 指的是A是否是B類型的。
10、覆蓋equals時總要覆蓋hashCode
兩個對象使用equals返回true,則他們的hashCode也一定相等,反之,如果兩個對象的hashCode相等,但他們的equals不一定相等。
11、始終要覆蓋toString
在實際應用中,toString方法應該返回對象中包含的所有值得關注的信息。
12、謹慎地覆蓋clone
13、考慮實現Comparable接口
Comparable接口只有一個方法:comparaTo
int x = a.comparaTo(b);
a>b,則x>0;
a=b,則x=0;
a<b,則x<0;
14、使類和成員的可訪問性最小化
15、要在公有類而非公有域中使用訪問方法
類的封裝:屬性私有化,提供getter/serter方法。
16、使可變性最小化
final:修飾類時,不能被繼承;修飾成員變量時,是常量。
17、復合優先於繼承
18、要么設計繼承並提供文檔說明,就用final修飾,禁止子類化
謹慎使用繼承:若使用了,要注釋寫出重寫這個方法會給其他方法帶來什么影響;
若類不是為繼承而生,就用final修飾,禁止子類化。
19、接口優於抽象類
因為java只支持單繼承,但可以實現多個接口。
20、接口只用於定義類型
接口不要只用於定義常量,不然還不如使用枚舉類或不可實例化的工具類。