实例变量验证

时间:2013-09-26 17:47:55

标签: java effective-java

阅读有效的java,它提到我们需要验证方法参数作为一种好的做法,为public提出异常并为私有方法断言。但是,我们是否需要针对实例变量采取任何措施。

EG :(不要以示例作为用例,主要问题是Do I need to validate instance var or Not ?。示例仅用于解释我的意思。)

class Tree {

   private Node root;

   public doSomething() {
      TreeNode node = root;
   }
}

现在假设root从未初始化并且doSomething()被直接调用,它将导致NullPtrException。

Do we need to guard against it ? If yes then how ? If no then why not ?

3 个答案:

答案 0 :(得分:1)

怎么样:

if (root == null) {
    throw new SomethingException();
}
TreeNode node = root;

简单地说,只需对根变量执行空检查,如果它为null,则相应地执行代码以修复该问题或为其抛出新的异常。

答案 1 :(得分:0)

将实例变量的任何验证代码移动到构造函数和setter,以便在设置或更改时检查它,如果在进行更改之前输入无效,则抛出任何异常。

这使得实例变量始终处于完全构造对象的有效状态,因此您不必在其他地方进行额外的验证。

答案 2 :(得分:0)

检查方法参数的既定做法可以推广到检查类的正确用法。在给定的示例中,当实例变量doSomething()尚未初始化时调用方法root是违法的。

如果您需要最佳实践规则,则通常不检查实例变量,而是检查是否遵守某个类的某个使用协议。 (除非类的编写方式不需要遵循特定的协议,这通常是更好的选择。)这种检查当然通常涉及检查实例变量。

与在负方法参数检查后抛出IllegalArgumentException相反,违反协议应该会导致IllegalStateException

在给定的示例中,应抛出IllegalStateException,因为该实例未处于可能调用doSomething()的状态。