'你編寫的程序高效、優雅嗎?阿里架構師教你編寫高效優雅Java程序'

"
"
你編寫的程序高效、優雅嗎?阿里架構師教你編寫高效優雅Java程序

面向對象

構造器參數太多怎麼辦?

用 builder 模式,用在

1、5 個或者 5 個以上的成員變量

2、參數不多,但是在未來,參數會增加

Builder 模式:

屬於對象的創建模式,一般有

  • 1. 抽象建造者:一般來說是個接口,包含 1)建造方法,建造部件的方法(不止一

個),2)返回產品的方法

  • 2. 具體建造者
  • 3. 導演者,調用具體的建造者,創建產品對象
  • 4. 產品,需要建造的複雜對象

對於客戶端,創建導演者和具體建造者,並把具體建造者交給導演者,然後由客戶端通知導演者操縱建造者進行產品的創建。

在實際的應用過程中,有時會省略抽象建造者和導演者。

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

如,一些工具類提供的都是靜態方法,這些類是不應該提供具體的實例的。可以參考 JDK

中的 Arrays。

不要創建不必要的對象

1. 避免無意中創建的對象,如自動裝箱

"
你編寫的程序高效、優雅嗎?阿里架構師教你編寫高效優雅Java程序

面向對象

構造器參數太多怎麼辦?

用 builder 模式,用在

1、5 個或者 5 個以上的成員變量

2、參數不多,但是在未來,參數會增加

Builder 模式:

屬於對象的創建模式,一般有

  • 1. 抽象建造者:一般來說是個接口,包含 1)建造方法,建造部件的方法(不止一

個),2)返回產品的方法

  • 2. 具體建造者
  • 3. 導演者,調用具體的建造者,創建產品對象
  • 4. 產品,需要建造的複雜對象

對於客戶端,創建導演者和具體建造者,並把具體建造者交給導演者,然後由客戶端通知導演者操縱建造者進行產品的創建。

在實際的應用過程中,有時會省略抽象建造者和導演者。

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

如,一些工具類提供的都是靜態方法,這些類是不應該提供具體的實例的。可以參考 JDK

中的 Arrays。

不要創建不必要的對象

1. 避免無意中創建的對象,如自動裝箱

你編寫的程序高效、優雅嗎?阿里架構師教你編寫高效優雅Java程序

2. 可以在類的多個實例之間重用的成員變量,儘量使用 static。

"
你編寫的程序高效、優雅嗎?阿里架構師教你編寫高效優雅Java程序

面向對象

構造器參數太多怎麼辦?

用 builder 模式,用在

1、5 個或者 5 個以上的成員變量

2、參數不多,但是在未來,參數會增加

Builder 模式:

屬於對象的創建模式,一般有

  • 1. 抽象建造者:一般來說是個接口,包含 1)建造方法,建造部件的方法(不止一

個),2)返回產品的方法

  • 2. 具體建造者
  • 3. 導演者,調用具體的建造者,創建產品對象
  • 4. 產品,需要建造的複雜對象

對於客戶端,創建導演者和具體建造者,並把具體建造者交給導演者,然後由客戶端通知導演者操縱建造者進行產品的創建。

在實際的應用過程中,有時會省略抽象建造者和導演者。

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

如,一些工具類提供的都是靜態方法,這些類是不應該提供具體的實例的。可以參考 JDK

中的 Arrays。

不要創建不必要的對象

1. 避免無意中創建的對象,如自動裝箱

你編寫的程序高效、優雅嗎?阿里架構師教你編寫高效優雅Java程序

2. 可以在類的多個實例之間重用的成員變量,儘量使用 static。

你編寫的程序高效、優雅嗎?阿里架構師教你編寫高效優雅Java程序

但是,要記住,是不要創建不必要的對象,而不是不要創建對象。

對象池要謹慎使用,除非創建的對象是非常昂貴的操作,如數據庫的連接,巨型對象等

等。

避免使用終結方法

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

應該用 try/finally。

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

編寫程序和設計架構,最重要的目標之一就是模塊之間的解耦。使類和成員的可訪問性最

小化無疑是有效的途徑之一。

使可變性最小化

儘量使類不可變,不可變的類比可變的類更加易於設計、實現和使用,而且更不容易出

錯,更安全。

常用的手段:

不提供任何可以修改對象狀態的方法;

使所有的域都是 final 的。

使所有的域都是私有的。

使用寫時複製機制。帶來的問題:會導致系統產生大量的對象,而且性能有一定的影響,

需要在使用過程中小心權衡。

複合優先於繼承

繼承容易破壞封裝性,而且會使子類的實現依賴於父類。

複合則是在類中增加一個私有域,引用類的一個實例,這樣的話就避免了依賴類的具體實

現。

只有在子類確實是父類的一個子類型時,才比較適合用繼承。

接口優於抽象類

java 是個單繼承的,但是類允許實現多個接口。

所以當發生業務變化時,新增接口,並且需要進行業務變化的類現新接口即可。但是抽象

類有可能導致不需要變化的類也不得不實現新增的業務方法。

在 JDK 裡常用的一種設計方法是:定義一個接口,聲明一個抽象的骨架類實現接口,骨架

類類實現通用的方法,而實際的業務類可以同時實現接口又繼承骨架類,也可以只實現接

口。

如 HashSet 實現了 implements Set 接口 但是又 extends 類 AbstractSet,而

AbstractSet 本身也實現了 Set 接口。其他如 Map,List 都是這樣的設計的。

方法

可變參數要謹慎使用

可變參數是允許傳 0 個參數的

如果是參數個數在 1~多個之間的時候,要做單獨的業務控制。

看代碼

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

方法的結果返回 null,會導致調用方的要單獨處理為 null 的情況。返回零長度,調用方可

以統一處理,如使用 foreach 即可。

JDK 中也為我們提供了 Collections.EMPTY_LIST 這樣的零長度集合

優先使用標準的異常

要儘量追求代碼的重用,同時減少類加載的數目,提高類裝載的性能。

常用的異常:

IlegalAraumentException -- 調用者傳遞的參數不合適

lllegalStateException – 接收的對象狀態不對,

NullPoint

UnsupportedOperationException –不支持的操作

通用程序設計

用枚舉代替 int 常量

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

枚舉更多作用,看代碼。

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

  • 1. 在第一次使用的地方進行聲明
  • 2. 局部變量都是要自行初始化,初始化條件不滿足,就不要聲明

最小化的好處,減小局部變量表的大小,提示性能;同時避免局部變量過早聲明導致不正

確的使用。

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

可以使用 int 或者 long 以及 BigDecimal

粉絲福利

離金9銀十還有不到兩個月,在這裡小編整理了一些互聯網大廠的面試題,分享給大家

"
你編寫的程序高效、優雅嗎?阿里架構師教你編寫高效優雅Java程序

面向對象

構造器參數太多怎麼辦?

用 builder 模式,用在

1、5 個或者 5 個以上的成員變量

2、參數不多,但是在未來,參數會增加

Builder 模式:

屬於對象的創建模式,一般有

  • 1. 抽象建造者:一般來說是個接口,包含 1)建造方法,建造部件的方法(不止一

個),2)返回產品的方法

  • 2. 具體建造者
  • 3. 導演者,調用具體的建造者,創建產品對象
  • 4. 產品,需要建造的複雜對象

對於客戶端,創建導演者和具體建造者,並把具體建造者交給導演者,然後由客戶端通知導演者操縱建造者進行產品的創建。

在實際的應用過程中,有時會省略抽象建造者和導演者。

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

如,一些工具類提供的都是靜態方法,這些類是不應該提供具體的實例的。可以參考 JDK

中的 Arrays。

不要創建不必要的對象

1. 避免無意中創建的對象,如自動裝箱

你編寫的程序高效、優雅嗎?阿里架構師教你編寫高效優雅Java程序

2. 可以在類的多個實例之間重用的成員變量,儘量使用 static。

你編寫的程序高效、優雅嗎?阿里架構師教你編寫高效優雅Java程序

但是,要記住,是不要創建不必要的對象,而不是不要創建對象。

對象池要謹慎使用,除非創建的對象是非常昂貴的操作,如數據庫的連接,巨型對象等

等。

避免使用終結方法

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

應該用 try/finally。

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

編寫程序和設計架構,最重要的目標之一就是模塊之間的解耦。使類和成員的可訪問性最

小化無疑是有效的途徑之一。

使可變性最小化

儘量使類不可變,不可變的類比可變的類更加易於設計、實現和使用,而且更不容易出

錯,更安全。

常用的手段:

不提供任何可以修改對象狀態的方法;

使所有的域都是 final 的。

使所有的域都是私有的。

使用寫時複製機制。帶來的問題:會導致系統產生大量的對象,而且性能有一定的影響,

需要在使用過程中小心權衡。

複合優先於繼承

繼承容易破壞封裝性,而且會使子類的實現依賴於父類。

複合則是在類中增加一個私有域,引用類的一個實例,這樣的話就避免了依賴類的具體實

現。

只有在子類確實是父類的一個子類型時,才比較適合用繼承。

接口優於抽象類

java 是個單繼承的,但是類允許實現多個接口。

所以當發生業務變化時,新增接口,並且需要進行業務變化的類現新接口即可。但是抽象

類有可能導致不需要變化的類也不得不實現新增的業務方法。

在 JDK 裡常用的一種設計方法是:定義一個接口,聲明一個抽象的骨架類實現接口,骨架

類類實現通用的方法,而實際的業務類可以同時實現接口又繼承骨架類,也可以只實現接

口。

如 HashSet 實現了 implements Set 接口 但是又 extends 類 AbstractSet,而

AbstractSet 本身也實現了 Set 接口。其他如 Map,List 都是這樣的設計的。

方法

可變參數要謹慎使用

可變參數是允許傳 0 個參數的

如果是參數個數在 1~多個之間的時候,要做單獨的業務控制。

看代碼

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

方法的結果返回 null,會導致調用方的要單獨處理為 null 的情況。返回零長度,調用方可

以統一處理,如使用 foreach 即可。

JDK 中也為我們提供了 Collections.EMPTY_LIST 這樣的零長度集合

優先使用標準的異常

要儘量追求代碼的重用,同時減少類加載的數目,提高類裝載的性能。

常用的異常:

IlegalAraumentException -- 調用者傳遞的參數不合適

lllegalStateException – 接收的對象狀態不對,

NullPoint

UnsupportedOperationException –不支持的操作

通用程序設計

用枚舉代替 int 常量

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

枚舉更多作用,看代碼。

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

  • 1. 在第一次使用的地方進行聲明
  • 2. 局部變量都是要自行初始化,初始化條件不滿足,就不要聲明

最小化的好處,減小局部變量表的大小,提示性能;同時避免局部變量過早聲明導致不正

確的使用。

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

可以使用 int 或者 long 以及 BigDecimal

粉絲福利

離金9銀十還有不到兩個月,在這裡小編整理了一些互聯網大廠的面試題,分享給大家

你編寫的程序高效、優雅嗎?阿里架構師教你編寫高效優雅Java程序

關注作者+轉發 轉發 轉發 重要的事說三遍

後臺回覆(面試)關鍵詞即可免費領取

"

相關推薦

推薦中...