第2條:遇到多個構造器參數時要考慮用建構器
某個類的屬性較多,初始化的時候又有一些是必須初始化的,而且類型有形同,
比如new Contact("姓名","顯示名","手機号","飛信号","所在地",年齡,性别);
前5個屬性是String 類型,後2個是int類型,在填寫構造方法的時候很容易填寫錯位,或者少填寫,或者颠倒了屬性,
如下方法可以減少這種錯誤發生的幾率,
- Contact contact = new Contact();
- contact.setName("姓名");
- contact.setDisplayName("顯示名");
- contact.setPhoneNumber("手機号");
- contact.setFetionNumber("飛信号");
- contact.setHometown("所在地");
- contact.setAge(23);
- contact.setGender(0);
這麼寫是通常的做法,看起來還不夠清晰,我們在每個set方法裡retrun一個Contact類型,比如
- public Contact setName(String name)
- {
- this.name = name;
- return this;
- }
這樣上面的構造Contact的代碼就可以這麼寫了
- Contact contact = new Contact() .setName("姓名")
- .setDisplayName("顯示名")
- .setPhoneNumber("手機号")
- .setFetionNumber("飛信号")
- .setHometown("所在地")
- .setAge(23)
- .setGender(0);
這樣寫是不是更清爽了!屬性不會再填寫錯誤了!而且閱讀代碼的時候也一目了然,都給Contact初始化了那些屬性,和屬性的值是什麼!
第3條:用私有構造器或者枚舉類型強化Singleton屬性
建議使用如下方法建立單例類
- public final class Elvis
- {
- private static Elvis INSTANCE;
- private Elvis(){};
- synchronized public static Elvis getInstance()
- {
- if( INSTANCE == null )
- {
- INSTANCE = new Elvis();
- }
- return INSTANCE;
- }
- //執行其他操作
- private Object readResolve()
- {
- return INSTANCE;
- }
- }
這種建構方法好處,組成類的成員聲明很清楚地表明了這個類是個Singleton,并且也解決了INSTANCE的同步問題,
沒有暴露共有的INSTANCE變量,這樣更有力于隐藏類的内部實作,
另外,改做法也很容易就可以修改成非單例模式,加上的readResolve方法可以保證反序列化時也是同一個對象。
第4條:通過私有構造器強化不可執行個體化的能力
我們軟體中常用的常量集(Constants),工具集(Tool,Utility)都應該是不可執行個體化的類,那麼他們應該如下建構
- public final class Constants
- {
- private Constants()
- {
- throw new AssertionError();
- }
- //其他常量的定義,或者靜态方法的實作;
- }
這樣可以防止被繼承,被執行個體化。
第5條:避免建立不必要的對象
建立一個String對象,最佳方式如下
- String str = "初始化值";
- 如果一個String在建立的時候我們不确定他的值,建議如下建立
- String str = "";
- 強烈反對
- String str = null;
- 這種寫法,因為會有NullPointerException這個異常的危險,另外主要還有潛在隐患,比如做了如下操作
- str += "ABC";
- 那麼str = nullABC;了這個不是想要的結果。
- str = "";的初始化方式也有他的不足之處,在判斷str是否有效的時候就要多加一個長度的判斷如下
- if( str==null||str.length()<=0 ){}