美文网首页Effective Java
第7章 检查参数的有效性

第7章 检查参数的有效性

作者: KubiL | 来源:发表于2017-06-28 23:18 被阅读0次

本章要讨论方法设计的几个方面:如何处理参数和返回值,如何设计方法签名,如何为方法编写文档。本章中大多数内容既适用于构造器,也适用于普通的方法。与第5章一样,本章焦点也集中在可用性、健壮性和灵活性上。

检查参数的有效性

绝大多数方法和构造方法对于传递给它们的参数都会有某些限制,比如对象引用不能为null,比如必须是正数等.你应该在文档中(或者注释中)清楚地指出所有这些限制,并且在方法体的开头出检查参数,并且强制施加这些限制.这就是发生错误之后尽快检测出错误,这一普遍性原则的具体情形.如果做不到这一点,检测出错误的可能性就很小,即使检测出错误,也难以确定错误根源.

共有方法参数检查

对于共有方法,要用javadoc的@throw标签在文档中说明违反参数值限制会抛出异常.
常用的异常如下:
IllegalArgumentException 非null的参数不正确
IllegalStateExcetion 对于方法调用而言,对象状态不正确
NullPointException 在禁止使用null的情况下参数值为null
IndexOutOfBoundException 下标参数值越界
ConcurrentModificationException 禁止并发修改情况下,对象进行修改
UnsupportedOperationException 对象不支持用户请求的方法
一旦在文档中记录对于方法参数的限制,并且记录一旦违反这些限制将抛出异常,强加这些限制就是必须的事情了.例如:

/**
      * 求模运算
      * @param m the modulus,which must be positive
      * @return this mod m
      * @throwsArithmeticException if m is less then or equal to 0
      */
     public int mod(BigInteger m){
            if (m.signum() <= 0 ) {
                   throw new ArithmeticException("Modulus <=0 :  " + m);
            }
            return this.n.signum() % m.signum();
     }

非公有方法参数检查

对于私有方法而言,你可以控制这个方法在那些情况下被调用,必须确保只将有效的参数传递进来.所以,非公有方法一般使用断言来检查参数的有效性.例如:

private static void sort(long[] a, int offset, int length) {
            assert a != null;
            assert offset >= 0 && offset <= a.length;
            assert length >= 0 && length <= a.length -offset;
            //do something
     }

本质上讲,断言是在声称被断言的条件为真,无论外围包的客户端如何使用它,异于有效性检查,断言失败将会抛出AsserttionError.如果断言没有发生作用,本质上不会产生成本开销.(vm参数 -ea来开启)

保留的方法参数检查

对于有些参数,方法本身没有用到,保存起来供以后使用.检测这些参数的有效性尤为重要.
例如:

static List<Integer> intArrayAsList (final int[] a) {
            if (a == null) {
                   throw new NullPointerException();
            }
           
            return new AbstractList<Integer>() {
 
                   @Override
                   public Integer get(int index) {
                          return a[index];
                   }
 
                   @Override
                   public int size() {
                          return a.length;
                   }
            };
     }

示例中,传入一个int数组,返回List视图.如果这个方法的客户端传递null,该方法会抛出一个NullPointerException,因为该方法显示的条件检查.
如果忽略这个条件检查,就是返回一个新建的List实例的引用,一旦客户端企图使用这个引用,就会立即抛出空指针异常,那时候想要找出List实例的来源就可能非常困难,使得开发调试工作极大地复杂化.
有些参数被方法保护起来供以后使用,构造方法代表这种原则的特殊情景,所以检查构造方法参数的有效性是非常重要的,可以避免构造出来的对象违反类的约束条件.

例外情况

在方法执行计算任务之前,应该先检查它的参数,这个规则有例外.一个重要的例外是,有效性检查非常昂贵,或者根本不切实际,或者有效性检查已经隐含在计算过程中完成.例如:考虑为一个对象排序的方法:
Collections.sort(List),列表中的所有对象必须是可以相互比较的.在为列表排序过程中,列表中的每个对象与其他对象进行比较.
如果这些对象不能进行比较,其中的某个比较操作就会发生异常ClassCastException,这正是sort方法应该做的事情.因此,提前检查列表的元素是否可以进行比较,这并没有多大的意义.
然而,请注意,不加选择使用这种方法将会导致失去失败原子性(以后异常会说到失败原子性,参考第64条).

总结

当编写方法或者构造方法的时候,应该考虑它的参数有哪些限制,应该把这些限制写到文档中,并且在这个方法的开头处,通过显示的检查来实施这些限制.养成这个习惯是非常必要的.

相关文章

  • Effective Java

    第38条:检查参数的有效性 对于公有的方法,要用 Javadoc 的@throws标签在文档中说明违反参数值限制时...

  • 检查参数的有效性

    前段时间,负责帮忙测试了一些接口。于是乎用postman测试,但是测试过程中出现了错误,返回的结果只是显示500状...

  • 第7章 检查参数的有效性

    本章要讨论方法设计的几个方面:如何处理参数和返回值,如何设计方法签名,如何为方法编写文档。本章中大多数内容既适用于...

  • 第 49 条:检查参数的有效性

  • 提示四十九:检查参数的有效性

    提示四十九:检查参数的有效性。 方法的参数限制,应该在文档中指明,并且在方法体的开头处检查参数,以强制施加这些限制...

  • 方法

    38,检查参数的有效性 你应该在文档中清楚地指明所有的参数限制,并且在方法的开头处检查参数,以强制施加这些限制。 ...

  • 第七章、方法

    第三十八条、检查参数的有效性 如果传递无效的参数值给方法,这个方法在执行之前应该先对参数进行检查,那么它很快就会失...

  • Java-构建器

    需求: 创建Bean实例时需要传入多个参数 需要控制参数的访问权限,防止被其他使用者修改 能够做参数有效性检查 构...

  • 项目49:检查参数的有效性

    ITEM 49: CHECK PARAMETERS FOR VALIDITY  大多数方法和构造函数对传入参数的值...

  • Java Rules 3

    1. 检查参数有效性 对所有的函数方法的入参进行有效性判断,参数如果不符合条件,则不能在第一时间发现问题,可能在后...

网友评论

    本文标题:第7章 检查参数的有效性

    本文链接:https://www.haomeiwen.com/subject/dnspcxtx.html