Effective Java 讀書筆記 4

2021-08-31 22:11:58 字數 1417 閱讀 6951

23,在新**裡不用使用raw type。用了泛型之後,可以提供編譯時型別檢查,便於及早發現錯誤,從集合裡讀取資料的時候也不用手動的cast。如果真的想向集合裡插入多種型別的資料,可以使用object作為引數型別,比如list這樣的。有點要注意的是class literal不能是泛型,只能有list.class,不能有list.class這樣的。由於泛型資訊在編譯時會被擦除,因此,instanceof操作符也不能和泛型進行比較,可以寫if(set instanceof set)或者if(set instanceof set<?>),但是不能寫if(set instanceof set) 。

24,去掉unchecked警告。如果實在消除不掉,而且又確定**是型別安全的,可以使用@suppresswarnings("unchecked"),這個做法其實也很常見, jdk的**裡都有,不過在使用這個註解的時候,一定要注意讓它的作用域盡可能的小,能寫在語句上就不要寫在函式上。作者舉了arraylist.toarray這個方法來作為反面例子。不過我個人以為作者在這方面有點吹毛求疵了。

25,list優先於陣列。陣列是協變(covariant)的,而泛型是不能協變的,這就是說,如果sub是super的子型別,那麼sub也是super的子型別,而list不是list的子型別。還有個區別是陣列是具體化的(reified),在執行時,陣列都知道自己的元素是什麼型別,而泛型的資訊在編譯後就被擦除了,執行時得不到了,這樣才能和以前的沒有使用泛型的舊**相容。基於以上這兩大區別,所以不能建立泛型陣列,不能使用new list, new list,new e這樣的語句。但是泛型陣列還是可以存在的,比如e a = (e)list.toarray(); 最終結論是不要混用陣列和泛型,如果真的這麼混用了而產生編譯錯誤或警告,那還是改用list吧。

26,在自己的**裡使用泛型。

27,使用泛型方法。不得不說,把方法變成泛型之後,方法簽名長了很多啊,不知道是不是沒有型別推導的原因,還要在方法修飾符和返回值之間在宣告一次泛型引數列表,原本的public static set union(set s1, set s2)現在變成了public static setunion(sets1, sets2),看起來極其囉嗦。到了jdk1.7,終於支援建構函式的型別推導了,再也不用寫冗長的map= new hashmap()了,可以寫成map= new hashmap<>()了。

28,使用有界萬用字元來增強api的靈活性。也就是? extends e或者? super e這樣的。還有就是不要在返回型別裡使用萬用字元。

29,使用型別安全的混雜容器。說實話,我覺得縱然書裡吹的好,如果需要把不同的型別混雜在乙個容器裡,還是raw型別用起來方便。

看完這一章之後,我感覺如果當時不是擴充套件舊的容器類,而是新造一套泛型容器,比如叫glist, gmap這樣的名字,拋棄相容性的包袱,也許泛型可以被設計的更好用。現在這樣,感覺雖然能用,但是不好用,寫起來又囉嗦。所以雖然大家廣泛的使用jdk提供的泛型類,但是自己在**裡寫泛型的就不多了。

Effective Java 讀書筆記

第二章 建立與銷毀物件 1 考慮用靜態工廠方法代替構造器 優點 1 有名稱 2 不必在每次呼叫他們的時候都建立乙個新的物件 3 他們可以返回原返回型別的任何子型別物件 4 使 更簡潔 缺點 1 類如果不含公有的或者受保護的構造器,就不能被子類化 2 與其他的靜態方法實際上沒有任何區別,不能一眼就看出...

Effective java 讀書筆記

一本書看了不少時間,終於這兩天看完了,看的眼睛生疼,估計也就領略了全書1 5的精華。這本書確確實實是本好書,就像剛剛牙牙學語的孩子必須接受父母的教導,電源插頭不可以摸,熱水不可以直接喝等等,很多經驗之談,給人確確實實的思考和應用。盡量多的編碼。如同讀書一樣,沒有一定的 量的積累,很難成為乙個好的程式...

Effective Java讀書筆記二

我們在設計類的時候,有些類難免會有許多的字段 fields 而這些字段可能需要在建立物件的時候對它們進行賦值。一般我們會考慮兩種方式 使用建構函式或者使用setter方法。使用建構函式的缺點很明顯,如果我們的字段過多,那麼就會讓建構函式的引數過多,在這種情況下,不但不容易理解和閱讀,而且非常容易出錯...