有效的Java清楚地表明assert
用于验证私有函数的参数。如果方法是公共方法,那么如果null是无效参数,则该方法应抛出NPE。
例如:
public void foo (Sting str) {
char[] ch = str.toCharArray();
}
在上面的代码中,我们不需要显式检查以确保str
为null,或者不需要null.toCharArray将抛出NPE
但如果代码改变为这样的话会怎么样:
public void foo (String str) {
List<String> strList = new ArrayList<String>();
bar (str, strList);
}
private void bar(String str, strList) {
assert strList != null;
char[] ch = str.toCharArray();
... ... ..
}
在这样的代码中,它会出现在私人功能栏上以抛出NPE。根据有效的java,私有代码应该只通过断言进行验证。 以下代码是否会被认为是比上述代码更好的做法?
public void foo (String str) {
if (str == null) throw NPE;
List<String> strList = new ArrayList<String>();
bar (str, strList);
}
private void bar(String str, strList) {
assert str != null;
assert strList != null;
char[] ch = str.toCharArray();
... ... ..
}
答案 0 :(得分:2)
在你的公共方法foo中,你有以下
if (str == null) throw new NullPointerException;
这通常被称为保护子句,并且通常比仅通过不包含任何内容而抛出空指针异常更具可读性。
关于assert,它通常在生产代码中没有使用@Sotirios提及。有关其他信息,请查看此答案:Java assertions underused。
这里肯定存在一些更好的主观性,但从可读性的角度来看,公共方法中的保护条款似乎更具可读性。断言不提供额外的值,特别是如果仅从该公共方法调用该私有方法。断言永远不会触发。