七、編寫高效優雅的java程序

一、面向對象

1、構造器參數太多

如果參數很多,會導致構造方法非常多,拓展性差,代碼難編寫,且難以看懂。 用 JavaBeans 模式,get 和 set 一行構造編程多行代碼實現,需要使用額外機制確保一致性和線程安全。
用 builder 模式:1、5 個或者 5 個以上的成員變量 2、參數不多,但是在未來,參數會增加。

2、不需要實例化的類應該構造器私有

如,一些工具類提供的都是靜態方法,這些類是不應該提供具體的實例的。可以參考 JDK 中的 Arrays。
好處:防止使用者 new 出多個實例。

3、不要創建不必要的對象

4、避免使用終結方法

finalizer 方法,jdk 不能保證何時執行,也不能保證一定會執行。如果有確實要釋放的資源應該用 try/finally。

5、使類和成員的可訪問性最小

模塊對外部其他模塊來說,隱藏其內部數據和其他實現細節——封裝 編寫程序和設計架構,最重要的目標之一就是模塊之間的解耦。使類和成員的可訪問性最小化無疑是有效的途徑之一。 類似於微服務。

6、使可變性最小化

儘量使類不可變,不可變的類比可變的類更加易於設計、實現和使用,而且更不容易出錯,更安全。 常用的手段:
不提供任何可以修改對象狀態的方法;
使所有的域都是 final 的。
使所有的域都是私有的。
使用寫時複製機制。

7、複合優先於繼承

繼承容易破壞封裝性,而且會使子類的實現依賴於父類。
複合則是在類中增加一個私有域,引用類的一個實例,這樣的話就避免了依賴類的具體實現。
例如在hashset中繼承它,實現一個count方法,在add、addAll時對count進行增加操作,會出現問題。

8、接口優於抽象類

接口只有方法申明,抽象類可以寫方法的實現。
java 是個單繼承的(不能繼承多個抽象類),但是類允許實現多個接口。 所以當發生業務變化時,新增接口,實現接口只需要新曾接口即可。但是抽象類有可能導致不需要變化的類也不得不實現新增的業務方法。
JDK 源碼中常用的一種設計方法:定義一個接口,聲明一個抽象的骨架類實現接口,骨架類類實現通用的方法,而實際的業務類可以同時實現接口又繼承 骨架類,也可以只實現接口。
如 HashSet 實現了 implements Set 接口 但是又 extends 類 AbstractSet,而 AbstractSet 本身也實現了 Set 接口。其他如 Map,List 都是這樣的設計的。

二、方法

1、可變參數謹慎使用

可變參數是允許傳 0 個參數的
如果是參數個數在 1~多個之間的時候,要做單獨的業務控制。 具體代碼不優雅。

2、返回零長度的數組或集合,不要返回 null

方法的結果返回 null,會導致調用方的要單獨處理爲 null 的情況。返回零長度,調用方可以統一處理,如使用 foreach 即可。
JDK 中也爲我們提供了 Collections.EMPTY_LIST 這樣的零長度集合

三、通用程序設計

1、用枚舉代替常量

聲明的一個枚舉本質就是一個類,每個具體的枚舉值就是這個枚舉類的實例。

  1. 使用常量容易在寫代碼時寫錯
  2. 使用常量如果要使用描述時比較麻煩
  3. 其他類使用常量時,類編譯時會把常量值直接寫到字節碼中,如果常量值有變化,所有相關的類需要重新編譯,否則會不可預料的錯誤
  4. 枚舉還可和行爲綁定

2、將局部變量的作用域最小化

  1. 在第一次使用的地方進行聲明
  2. 局部變量都是要自行初始化,初始化條件不滿足,就不要聲明 最小化的好處,減小局部變量表的大小,提高性能;同時避免局部變量過早聲明導致不正確的使用。

3、精確計算,避免使用 float 和 double

float 和 double 在 JVM 存儲的時候,有部分要做整數位,有部分要做小數位,所以存在精度上的問題,可以使用 int 或者 long 以及 BigDecimal

4、當心字符串連接的性能

在存在大量字符串拼接或者大型字符串拼接的時候,儘量使用 StringBuilder 和 StringBuffer

5、控制方法的大小

方法過大不宜與維護

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