第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修飾不會報錯,但是一旦改變了變數的值就會報錯 區域性類如果乙個內部類需要在多個方法之外仍然是可見的,或者是它太長了,不適合於放在方法內部,就應該使用成員類。如果成員類的每個...