對我而言,防禦性編程意味着編寫代碼來處理您認爲不會或甚至可能發生的情況,因爲您認爲自己的信仰不可靠。
例如(未編譯或測試,條款和條件適用):
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?這個問題是根據「我應該在考試中寫什麼」的方式來表達的,但這是不是一個關於編程的問題? –