《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元素编写文档注释

本文地址: https://www.cnblogs.com/laishenghao/p/effective_java_note_methods.html

 

猜你喜欢

转载自www.cnblogs.com/laishenghao/p/effective_java_note_methods.html