文章目錄
- 撰寫高效優雅 Java 程式
- 面向物件
- 01、構造器引數太多怎么辦?
- Builder 模式:
- 02、不需要實體化的類應該構造器私有
- 03、不要創建不必要的物件
- 04、避免使用終結方法
- 05、使類和成員的可訪問性最小化
- 06、使可變性最小化
- 07、復合優先于繼承
- 08、介面優于抽象類
- 方法
- 09、可變引數要謹慎使用
- 10、回傳零長度的陣列或集合,不要回傳 null
- 11、優先使用標準的例外
- 通用程式設計
- 12、用列舉代替 int 常量
- 13、將區域變數的作用域最小化
- 14、精確計算,避免使用 float 和 double
- 15、當心字串連接的性能
- 16、控制方法的大小
撰寫高效優雅 Java 程式
面向物件
01、構造器引數太多怎么辦?
如果引數很多,會導致構造方法非常多,拓展性差,代碼難撰寫,且難以看懂,
- 用 JavaBeans 模式
get 和 set
一行構造編程多行代碼實作,需要使用額外機制確保一致性和執行緒安全, - 用 builder 模式,
1、5 個或者 5 個以上的成員變數
2、引數不多,但是在未來,引數會增加
Builder 模式:
屬于物件的創建模式,一般有
1、 抽象建造者:一般來說是個介面,包含 1)建造方法,建造部件的方法(不止一個),2)回傳產品的方法
2、 具體建造者
3、 導演者,呼叫具體的建造者,創建產品物件
4、 產品,需要建造的復雜物件
對于客戶端,創建導演者和具體建造者,并把具體建造者交給導演者,然后由客戶端通知導演者操縱建造者進行產品的創建, 在實際的應用程序中,有時會省略抽象建造者和導演者, 優勢:如果當大多數引數是可選時,代碼易于閱讀和撰寫,比 JavaBean 更加安全,
02、不需要實體化的類應該構造器私有
如,一些工具類提供的都是靜態方法,這些類是不應該提供具體的實體的,可以參考 JDK 中的 Arrays, 好處:防止使用者 new 出多個實體,
03、不要創建不必要的物件
1、 避免無意中創建的物件,如自動裝箱

可以在類的多個實體之間重用的成員變數,盡量使用 static,
性能對比,
但是,要記住,是不要創建不必要的物件,而不是不要創建物件,
物件池要謹慎使用,除非創建的物件是非常昂貴的操作,如資料庫的連接,巨型物件等等
04、避免使用終結方法
finalizer 方法,jdk 不能保證何時執行,也不能保證一定會執行,如果有確實要釋放的資源應該用 try/finally
05、使類和成員的可訪問性最小化
模塊對外部其他模塊來說,隱藏其內部資料和其他實作細節——封裝
撰寫程式和設計架構,最重要的目標之一就是模塊之間的解耦,使類和成員的可訪問性最小化無疑是有效的途徑之一, 類似于微服務
06、使可變性最小化
盡量使類不可變,不可變的類比可變的類更加易于設計、實作和使用,而且更不容易出錯,更安全, 常用的手段:
不提供任何可以修改物件狀態的方法;
使所有的域都是 final 的,
使所有的域都是私有的,
使用寫時復制機制,
07、復合優先于繼承
繼承容易破壞封裝性,而且會使子類的實作依賴于父類,
復合則是在類中增加一個私有域,參考類的一個實體,這樣的話就避免了依賴類的具體實作,
只有在子類確實是父類的一個子型別時,才比較適合用繼承,
繼承需要開發者對父類的結構有一定了解,
實際使用,如果肯定是父類的子類,使用繼承,如果不很肯定,使用復合,
08、介面優于抽象類
介面只有方法申明,抽象類可以寫方法的實作,
java 是個單繼承的(不能繼承多個抽象類),但是類允許實作多個介面,
所以當發生業務變化時,新增介面,實作介面只需要新增介面即可,但是抽象類有可能導致不需要變化的類也不得不實作新增的業務方法,
JDK 原始碼中常用的一種設計方法:定義一個介面,宣告一個抽象的骨架類實作介面,骨架類類實作通用的方法,而實際的業務類可以同時實作介面又繼承 骨架類,也可以只實作介面,
如 HashSet 實作了 implements Set 介面 但是又 extends 類 AbstractSet,而 AbstractSet 本身也實作了 Set 介面,其他如 Map,List 都是這樣的設計的,
方法
09、可變引數要謹慎使用
可變引數是允許傳 0 個引數的
如果是引數個數在 1~多個之間的時候,要做單獨的業務控制,
具體代碼不優雅,
10、回傳零長度的陣列或集合,不要回傳 null
方法的結果回傳 null,會導致呼叫方的要單獨處理為 null 的情況,回傳零長度,呼叫方可以統一處理,如使用 foreach 即可,
JDK 中也為我們提供了 Collections.EMPTY_LIST 這樣的零長度集合
11、優先使用標準的例外
要盡量追求代碼的重用,同時減少類加載的數目,提高類裝載的性能
- 常用的例外
throw new IllegalArgumentException();//呼叫者傳遞的引數不合適
// throw new IllegalStateException();//接收的物件狀態不對
// throw new UnsupportedOperationException();//不支持的操作
通用程式設計
12、用列舉代替 int 常量
宣告的一個列舉本質就是一個類,每個具體的列舉值就是這個列舉類的實體,
- 使用常量容易在寫代碼時寫錯
- 使用常量如果要使用描述時比較麻煩
- 其他類使用常量時,類編譯時會把常量值直接寫到位元組碼中,如果常量值有變化,所有相關的類需要重新編譯,否則會不可預料的錯誤
- 列舉高級:
列舉和行為系結
所謂列舉的本質就是一個類,而列舉中定義的每一個具體的列舉型別其實就是這個列舉類的一個實體, 策略列舉:
13、將區域變數的作用域最小化
1、 在第一次使用的地方進行宣告
2、 區域變數都是要自行初始化,初始化條件不滿足,就不要宣告
最小化的好處,減小區域變數表的大小,提高性能;同時避免區域變數過早宣告導致不正確的使用,
14、精確計算,避免使用 float 和 double
float 和 double 在 JVM 存盤的時候,有部分要做整數位,有部分要做小數位,所以存在精度上的問題 可以使用 int 或者 long 以及 BigDecimal
15、當心字串連接的性能
在存在大量字串拼接或者大型字串拼接的時候,盡量使用 StringBuilder 和 StringBuffer
16、控制方法的大小
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/263429.html
標籤:其他
