阅读有效的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 ?
答案 0 :(得分:1)
怎么样:
if (root == null) {
throw new SomethingException();
}
TreeNode node = root;
简单地说,只需对根变量执行空检查,如果它为null,则相应地执行代码以修复该问题或为其抛出新的异常。
答案 1 :(得分:0)
将实例变量的任何验证代码移动到构造函数和setter,以便在设置或更改时检查它,如果在进行更改之前输入无效,则抛出任何异常。
这使得实例变量始终处于完全构造对象的有效状态,因此您不必在其他地方进行额外的验证。
答案 2 :(得分:0)
检查方法参数的既定做法可以推广到检查类的正确用法。在给定的示例中,当实例变量doSomething()
尚未初始化时调用方法root
是违法的。
如果您需要最佳实践规则,则通常不检查实例变量,而是检查是否遵守某个类的某个使用协议。 (除非类的编写方式不需要遵循特定的协议,这通常是更好的选择。)这种检查当然通常涉及检查实例变量。
与在负方法参数检查后抛出IllegalArgumentException
相反,违反协议应该会导致IllegalStateException
。
在给定的示例中,应抛出IllegalStateException
,因为该实例未处于可能调用doSomething()
的状态。