1. 程式人生 > >《Effective Java》學習筆記 —— 方法

《Effective Java》學習筆記 —— 方法

  主要內容:如何處理引數和返回值,如何設計方法簽名,如何編寫方法文件。

第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());
3
this.end = new Date(end.getTime()); 4 }

第40條 謹慎設計方法簽名

  * 方法的名稱應當始終遵循標準的命名習慣。

  * 不要過於追求提供便利的方法。

  * 避免過長的引數列表。

第41條 慎用過載

  * 對於過載方法(overloaded method)的選擇是靜態的,而對於被覆蓋的方法(overridden method)的選擇則是動態的。

  對於下面的例子,其實在未執行時已經確定了實際呼叫的方法。

 1 import java.util.*;
 2 import java.util.concurrent.DelayQueue;
3 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 public
String 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 }
Bad overload

  * 比較保守的做法:儘量不要匯出具有相同型別引數數目的過載方法,或至少有一個完全不同型別的入參。

一個反例: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元素編寫文件註釋