对我而言,防御性编程意味着编写代码来处理您认为不会或甚至可能发生的情况,因为您认为自己的信仰不可靠。
例如(未编译或测试,条款和条件适用):
private String findSmallestString(Collection<String> strings) {
if (strings == null || strings.isEmpty()) return null;
Iterator<String> stringsIt = strings.iterator();
try {
String smallestString = stringsIt.next();
while (stringsIt.hasNext()) {
String candidateString = stringsIt.next();
if (candidateString == null) continue;
if (candidateString.compareTo(smallestString) < 0) {
smallestString = candidateString;
}
}
return smallestString;
}
catch (NoSuchElementException e) {
return null;
}
}
在那里,可以说是防御功能包括:
- 顶部的空值或空后卫子句;这是一种私有方法,因此您应该确保它永远不会被调用为空或空集合。
- NoSuchElementException的try-catch;你可以证明它所包含的代码在迭代器履行合同时不会抛出这个异常。
- 从迭代器出来的字符串(不是第一个!)的无效保护子句;再次,由于这是一种私人方法,因此您应该可以确保收集参数不包含空值(并且无论如何您会将空值置入收藏中?)
不是所有人都会同意null检查是防御性的。尝试抓住是完全没有意义的。
对我来说,防守编程的酸性测试就是你不认为防守会被使用。
有人已经投票决定关闭的题外话。 WTF?这个问题是根据“我应该在考试中写什么”的方式来表达的,但这是不是一个关于编程的问题? –