類設計技巧

1. 一定要保證數據私有

這是最重要的;絕對不要破壞封裝性。有時候, 需要編寫一個訪問器方法或更改器方法,
但是最好還是保持實例域的私有性。很多慘痛的經驗告訴我們, 數據的表示形式很可能會改
變, 但它們的使用方式卻不會經常發生變化。當數據保持私有時, 它們的表示形式的變化不
會對類的使用者產生影響, 即使出現 bug 也易於檢測。

2. 一定要對數據初始化

Java 不對局部變量進行初始化, 但是會對對象的實例域進行初始化。最好不要依賴於系
統的默認值, 而是應該顯式地初始化所有的數據, 具體的初始化方式可以是提供默認值, 也
可以是在所有構造器中設置默認值。

3. 不要在類中使用過多的基本類型

就是說,用其他的類代替多個相關的基本類型的使用。這樣會使類更加易於理解且易於
修改。例如, 用一個稱爲 Address 的新的類替換一個 Customer 類中以下的實例域:

private String street;
private String city;
private String state;
private int zip;

這樣, 可以很容易處理地址的變化, 例如, 需要增加對國際地址的處理。

4. 不是所有的域都需要獨立的域訪問器和域更改器

或許, 需要獲得或設置僱員的薪金。 而一旦構造了僱員對象, 就應該禁止更改僱用日
期,並且在對象中,常常包含一些不希望別人獲得或設置的實例域, 例如, 在 Address 類中,
存放州縮寫的數組。

5. 將職責過多的類進行分解

這樣說似乎有點含糊不清, 究竟多少算是“ 過多” ? 每個人的看法不同。但是,如果明
顯地可以將一個複雜的類分解成兩個更爲簡單的類,就應該將其分解(但另一方面,也不要
走極端。設計 10 個類,每個類只有一個方法,顯然有些矯枉過正了)。
下面是一個反面的設計示例

public class CardDeck // bad design
{
private intvalue;
private int[] suit;
public CardDeck() { . . . }
public void shuffle0 { • • • }
public int getTopValueO { . . . }
public int getTopSuitO { . . . }
public void drawO {• ■ . }
}

實際上,這個類實現了兩個獨立的概念:一副牌(含有 shuffle 方法和 draw方法)和一
張牌(含有查看面值和花色的方法)。另外, 引入一個表示單張牌的 Card 類。現在有兩個類,
每個類完成自己的職責:

public cl ass CardDeck
{
private Card[] cards;
public CardDeckO { • . . }
public void shuffle() { . . . }
public Card getTopO { . . . }
public void draw() { . . . }
}
public class Card
{
private int value;
private int suit;
146 Java 核心技?
public Card(int aValue, int aSuit) { . . . }
public int getValueO { . . . }
public int getSuitO { . . . }
}

6. 類名和方法名要能夠體現它們的職責

與變量應該有一個能夠反映其含義的名字一樣, 類也應該如此(在標準類庫中, 也存在
着一些含義不明確的例子,如:Date 類實際上是一個用於描述時間的類)。
命名類名的良好習慣是採用一個名詞(Order )、 前面有形容詞修飾的名詞( RushOrder )
或動名詞(有“ -ing” 後綴)修飾名詞(例如, BillingAddress)。對於方法來說,習慣是訪問
器方法用小寫 get 開頭 ( getSalary ), 更改器方法用小寫的 set 開頭(setSalary )

7.優先使用不可變的類

LocalDate 類以及 java.time 包中的其他類是不可變的—沒有方法能修改對象的狀態。
類似 plusDays 的方法並不是更改對象,而是返回狀態已修改的新對象。
更改對象的問題在於, 如果多個線程試圖同時更新一個對象,就會發生併發更改。其結
果是不可預料的。如果類是不可變的,就可以安全地在多個線程間共享其對象。
因此, 要儘可能讓類是不可變的, 這是一個很好的想法。對於表示值的類, 如一個字符
串或一個時間點,這尤其容易。計算會生成新值, 而不是更新原來的值。
當然,並不是所有類都應當是不可變的。如果員工加薪時讓 raiseSalary 方法返回一個新
Employee 對象, 這會很奇怪。

來源:Core Java Volume I–Fundamentals, 10th Edition

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