Effective Java-学习笔记(6-9章)

方法

38.检查参数的有效性

  • 可以防止程序往下执行出错
  • 可以保证方法的健壮性

39.必要时进行保护性拷贝

/** * 保护性拷贝示例 */
public class Period {

    private final Date start;
    private final Date end;

    public Period(Date start, Date end) {
        this.start = new Date(start.getTime());//传入参数的时候,保护性拷贝
        this.end = new Date(end.getTime());//传入参数的时候,保护性拷贝
        /** * 传入保护性拷贝,避免下面情况 * Date start = new Date(); Date end = new Date(); Period mPeriod = new Period(start, end); start.setYear(1998); */
        if (start.compareTo(end) > 0) {
            throw new IllegalArgumentException("start can not after end");
        }
    }

    public Date getStart() {
        return new Date(start.getTime());//获取的时候保护性拷贝
    }

    public Date getEnd() {
        return new Date(end.getTime());//获取的时候保护性拷贝
        /** * 获取的时候避免下面问题 * Date start = new Date(); Date end = new Date(); Period mPeriod = new Period(start, end); mPeriod.getStart().setYear(1998); */
    }
}

最简单的例子,就是Android开发的时候传递给适配器Adapter一个List对象,用于填充ListView的Item元素,但是在Adapter外部,直接修改了List
的对象数据,但是没有调用notify方法。程序就有可能报错。
The content of the adapter has changed but ListView did not receive a notification

40.谨慎设计方法签名

谨慎的选择方法的名称
RE:方法名称要规范

不要过于追求提供便利的方法
RE:封装方法的时候,思考一下,有没有必要

避免过长的参数列表
RE:原则上参数不超过4个。如果需要多个参数,建议使用Builder建造者模式。

41.慎用重载

建议:永远不要导出2个具有相同参数数目的重载方法。如果是可变参数,保守的建议是,根本不要重载它。
RE:可以名称不一样。比如:writeInt writeLong writeString

如果相同数目的参数,2个之间完全不可能相互转换。也可以,比如String valueOf(char value) String valueOf(double value)

妥协的方案:
1.多个具有相同参数数目的方法,尽量避免使用重载。
2.如果不能避免,尽量避免只要经过类型转换就能传递给不同的重载方法
3.如果还不能避免,就要保证重载方法的行为必须一致。

42.慎用可变参数

要进行参数校验。避免传入0个参数,导致程序异常。

43.返回零长度的数据或者集合,而不是null

  • 数组可用方式
    原理:零长度数组传递给toArray,可以指明期望的返回类型。正常情况下,toArray分配了返回的数组。但是如mEmptyData为空,将使用零长度的输入数组。Collection.toArray(T[])规范保证:如果输入数组达到足够容纳这个集合,就返回这个数组。
    private static final String[] mEmptyData = new String[0];

    public static String[] getList() {
        List<String> cheeseList = null;
        if (cheeseList == null) {
            return mEmptyData;
        }
        return cheeseList.toArray(mEmptyData);
    }
  • 列表可用方式
public static List<String> getList2() {
        List<String> cheeseList = null;
        if (cheeseList == null || cheeseList.isEmpty()) {
            return Collections.emptyList();
        }
        return cheeseList;
    }

采用Collections.emptyList();返回一个空集合。

你可能感兴趣的:(Effective Java-学习笔记(6-9章))