Effective Java之泛型 總結

2021-09-11 15:57:36 字數 1875 閱讀 2253

第23條 請不要在新**中使用原生態型別

如果使用原生態型別 就失掉了泛型在安全性和表述性方面的所有優勢

如果使用像list這樣的原生態型別 就會失掉型別安全性 但是如果使用像list這樣的引數化型別 則不會

在類文字(class literal)中必須使用原生態型別

set是個引數化型別 表示可以包含任何物件型別的乙個集合 set<?>則是乙個萬用字元型別 表示只能包含某種未知物件型別的乙個集合 set則是個原生態型別 它脫離了泛型系統 前兩種是安全的 最後一種不安全

分類術語

示例引數化的型別

list

實際型別引數

string

泛型list

形式型別引數

e無限制萬用字元型別

list<?>

原生態型別

list

有限制型別引數

遞迴型別限制

有限制萬用字元型別

list<? extends number>

泛型方法

static list aslist(e a)

型別令牌

string.class

第24條 消除非受檢警告

要盡可能地消除每乙個非受檢警告

如果無法消除警告 同時可以證明引起警告的**是型別安全的(只有在這種情況下才) 可以用乙個@suppresswarnings(「unchecked」)註解來禁止這條警告

應該始終在盡可能小的範圍中使用suppresswarnings註解

每當使用suppresswarnings(「unchecked」)註解時 都要新增一條注釋 說明為什麼這麼做是安全的

第25條 列表優先於陣列

陣列是協變的 泛型是不可變的

陣列是有缺陷的

泛型是通過擦除來實現的

陣列提供了執行時的型別安全 但是沒有編譯時的型別安全 泛型與之相反 一般來說 陣列和泛型不能很好地混合使用

第26條 優先考慮泛型

使用泛型比使用需要在客戶端**中進行轉換的型別來得更加安全 也更加容易 在設計新型別的時候 要確保它們不需要這種轉換就可以使用 這通常意味著要把類做成是泛型的

只要時間允許 就把現有的型別都泛型化 這對於這些型別的新使用者來說會變得更加輕鬆 又不會破壞現有的客戶端

第27條 優先考慮泛型方法

靜態工具方法尤其適合於泛型化

泛型方法是通過型別推導實現的

就像型別一樣 你應該確保新方法可以不用轉換就能使用 這通常意味著要將它們泛型化 並且就像型別一樣 還應該將現有的方法泛型化

第28條 利用有限制萬用字元來提公升api的靈活性

為了獲得最大系限度的靈活性 要在表示生產者或者消費者的輸入引數上使用萬用字元型別

如果引數化型別表示乙個t生產者 就使用<? extends t> 如果它表示乙個t消費者 就使用<? super t>

不要用萬用字元型別作為返回型別

如果使用得當 萬用字元型別對於類的使用者來說幾乎是無形的 它們使方法能夠接受它們應該接受的引數 並拒絕那些應該拒絕的引數 如果類的使用者必須考慮萬用字元型別 類的api或許就會出錯

如果型別引數只在方法宣告**現一次 就可以用萬用字元取代它

第29條 優先考慮型別安全的異構容器

集合api說明了泛型的一般用法 限制你每個容器只能有固定數目的型別引數 你可以通過將型別引數放在鍵上而不是容器上來避開這一限制 對於這種型別安全的異構容器 可以用class物件作為鍵 以這種方式使用的class物件稱作型別令牌 你也可以使用定製的鍵型別 例如 用乙個databaserow型別表示乙個資料庫行(容器) 用泛型column作為它的鍵

Effective Java之通用程式設計 總結

第45條 將區域性變數的作用域最小化 要使區域性變數的作用域最小化 最有力的方法就是在第一次使用它的地方宣告 幾乎每個區域性變數的宣告都應該包含乙個初始化表示式 如果在迴圈終止之後不再需要迴圈變數的內容 for迴圈就優先於while迴圈 for int i 0,n expensivecomputat...

EffectiveJava之19 用類層次代替聯合

1 c中的聯合體 typedef enum shape type typedef struct rectangledimensions t typedef struct circle dimensions t typedef struct dimensions shape t double area...

《effective Java》讀後筆記

為什麼區域性變數要宣告為 final 在jdk 1.8 之前,不用final修飾會編譯報錯。在jdk 1.8 中,不用final修飾不會報錯,但是一旦改變了變數的值就會報錯 區域性類如果乙個內部類需要在多個方法之外仍然是可見的,或者是它太長了,不適合於放在方法內部,就應該使用成員類。如果成員類的每個...