Java核心技術 卷1 基礎知識 部分筆記

Zephyr_g發表於2018-04-13

類設計技巧

  1. 一定要保證資料私有,有時需要寫一個訪問器或者更改器方法,但是最好還是保持例項域的私有性。經驗告訴我們,資料的表示形式可能會改變,但是他們的使用方法卻不會經常發生改變。當資料保持私有時,他們的表現形式的變化不會對類的使用者產生影響,即使出現bug也易於檢測。
  2. 一定要對資料初始化,最好不要依賴於系統的預設值。
  3. 不要在類中使用過多的基本型別。就是說,用其他的類代替多個相關的基本型別的使用。這樣會使類更加易於理解且易於修改。例如用一個稱為Address的新的類替換一個Customer類一下的例項域:
private String street;
private String city;
private String state;
private int zip;
  1. 不是所有的域都需要獨立的域訪問器和域更改器。
  2. 將職責過多的類進行分解(單一職責原則)
  3. 類名和方法名一定要體現他們的職責。

繼承設計的技巧

  1. 將公共操作和域放在超類。
  2. 不要使用受保護的域,不過,protected方法對於指示那些不提供一般用途而應在子類中重新定義的方法很有用。
  3. 使用繼承實現”is-a”關係。
  4. 除非所有繼承的方法都有意義,否則不要使用繼承。(少用繼承,多用組合,被繼承的無用方法時有害的)
  5. 在覆蓋方法時,不要改變預期的行為。(行為的多型,而不是變態。。。)
  6. 使用多型,而非型別資訊。
    無論什麼時候,對於下面這種形式的程式碼
if(x is of type1) action1(x);
else if(x is of type2) action2(x);

       都應該考慮使用多型性。if else實際上是硬編碼,不具有擴充套件性,不符合面向開閉原則,使用多型性,可以利用動態繫結原則,在執行時獲取真正要執行的型別,易於擴充套件。
7. 不要過多的使用反射。

equals和hashCode方法

       在Object類中,equals()方法用來判斷兩個物件是否具有相同的引用。然而對於多數類來說,這種判斷沒有什麼意義。我們應該重寫這個方法,比如通過身份證是否相同來判斷是否是同一個人等,相同則認為兩個物件是相等的。
       雜湊碼(hash code)是由物件匯出的一個整數值。雜湊碼是沒有規律的。兩個物件的hashCode基本不會相同。由於hashCode定義在Object類中,因此每個物件都有一個預設的雜湊碼,其值為物件的儲存地址。如果要重寫hashCode,那麼它應該是一個整型數值(也可以是負數),併合理地組合例項域的雜湊碼,以便以後能讓各個不同的物件產生的雜湊碼更加均勻。
       如果重新定義equals方法,就必須重新定義hashCode方法,以便使用者可以將物件插入到雜湊表中。
這裡寫圖片描述
或者
這裡寫圖片描述

       equals與hashCode的定義必須一致:如果x.equals(y)返回true,那麼x.hashCode()就必須與y.hashCode()具有相同的值。例如,如果用定義的Employee.equals比較僱員的ID,那麼hashCode()方法就需要雜湊ID,而不是僱員的姓名或者儲存地址。
       如果存在陣列型別的域,那麼可以使用靜態的Arrays.hashCode()方法計算一個雜湊碼,這個雜湊碼由陣列元素的雜湊碼組成。

相關文章