《Effective Java》學習筆記 —— 方法
阿新 • • 發佈:2018-12-15
主要內容:如何處理引數和返回值,如何設計方法簽名,如何編寫方法文件。
第38條 檢查引數的有效性
特別是來自不可信域的引數。
第39條 必要時進行保護性拷貝
反例:
1 public Period(Date start, Date end) { 2 this.start = start; 3 this.end = end; 4 }
正例:
1 public Period(Date start, Date end) { 2 this.start = new Date(start.getTime()); 3this.end = new Date(end.getTime()); 4 }
第40條 謹慎設計方法簽名
* 方法的名稱應當始終遵循標準的命名習慣。
* 不要過於追求提供便利的方法。
* 避免過長的引數列表。
第41條 慎用過載
* 對於過載方法(overloaded method)的選擇是靜態的,而對於被覆蓋的方法(overridden method)的選擇則是動態的。
對於下面的例子,其實在未執行時已經確定了實際呼叫的方法。
1 import java.util.*; 2 import java.util.concurrent.DelayQueue;Bad overload3 4 /** 5 * @author https://www.cnblogs.com/laishenghao/ 6 * @date 2018/10/13 7 */ 8 public class BadOverload { 9 10 public String getType(List<?> list) { 11 return "List"; 12 } 13 14 public String getType(Set<?> set) { 15 return "Set"; 16 } 17 18 publicString getType(Collection<?> collection) { 19 return "Unknown"; 20 } 21 22 public static void main(String[] args) { 23 24 Collection<?>[] collections = { 25 new ArrayList<>(), 26 new HashSet<>(), 27 new DelayQueue<>() 28 }; 29 30 BadOverload badOverload = new BadOverload(); 31 for (Collection<?> item : collections) { 32 System.out.println(badOverload.getType(item)); // all print "Unknown" 33 } 34 } 35 36 }
* 比較保守的做法:儘量不要匯出具有相同型別引數數目的過載方法,或至少有一個完全不同型別的入參。
一個反例:Set 與 List 的 remove 方法造成的混淆:
Set只有一個remove方法,而List有兩個:
boolean remove(Object o);
E remove(int index);
1 public static void main(String[] args) { 2 Set<Integer> set = new TreeSet<>(); 3 List<Integer> list = new ArrayList<>(); 4 5 // construct same data 6 for (int i = -3; i < 3; i++) { 7 set.add(i); 8 list.add(i); 9 } 10 11 // try to remove the non-negative numbers 12 for (int i = 0; i < 3; i++) { 13 set.remove(i); 14 list.remove(i); 15 } 16 17 // result: [-3, -2, -1] [-2, 0, 2] 18 System.out.println(set + " " + list); 19 }
第42條 慎用可變引數
* 檢查引數的個數或在前面多寫一個相同型別的引數。
1 static int min(int first, int... remainingArgs) { 2 int min = first; 3 for (int i : remainingArgs) { 4 if (i < min) { 5 min = i; 6 } 7 } 8 return min; 9 }
第43條 返回零長度的陣列或者集合,而不是null
書中推薦返回固定的靜態零長度陣列或集合。對於固定的返回值,我認為應該視情況而定,如果是後臺返回給前臺,在沒有元素的情況下,返回Collections.emptySet()等是合理的;但如果是在本模組下進行操作,這種不可變的集合就不太適用了,特別是需要對集合做進一步修改的時候。
第44條 為所有匯出的API元素編寫文件註釋