对我来说,防御性编程意味着编写代码来处理您认为不会发生甚至不可能发生的情况,因为您相信自己的信念是不可靠的。
例如(未编译或测试,适用条款和条件):
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;
}
}
在那里,可以说是防御功能包括:
- 顶部的空或空保护子句;这是一个私有方法,因此您应该确保永远不会使用 null 或空集合调用它
- NoSuchElementException 的 try-catch;您可以证明,如果迭代器履行其合同,它包含的代码将永远不会抛出此异常。
- 从迭代器出来的字符串(除了第一个!)上的无效保护子句;再一次,因为这是一个私有方法,你应该能够确保集合参数不包含空值(无论如何你会把空值放在集合中做什么?)
不是每个人都同意空检查是防御性的。try-catch 是完全没有意义的。
对我来说,防御性编程的严峻考验是你认为永远不会使用防御。