界: API Abuse

API 就像是呼叫者與被呼叫者之間簽訂的規定。最常見的 API 濫用形式是由呼叫者這一當事方未能遵守此規定所造成的。例如,如果程式在呼叫 chroot() 後無法呼叫 chdir(),即違反規範如何以安全方式變更使用中根目錄的規定。程式庫濫用的另一個好例子是期待被呼叫者向呼叫者傳回值得信賴的 DNS 資訊。在這種情況下,呼叫者是透過對其行為做出某些假設 (傳回值可用於驗證目的) 來濫用被呼叫者 API。另一方也可能違反呼叫者與被呼叫者間的規定。例如,如果編碼器衍生出子類別 SecureRandom 並傳回一個非隨機值,則違反了規定。

Object Model Violation: Just one of equals() and hashCode() Defined

Abstract
此類別僅覆寫其中一個 equals()hashCode()
Explanation
Java 物件預期會遵守數個與等式相關的不變量。其中一個不變量是,相等的物件必須有相等的雜湊碼。換句話說,如果 a.equals(b) == true,那麼 a.hashCode() == b.hashCode()

如果沒有堅持使用此不變量,當此類別的物件儲存在集合中時,可能會造成一些問題。如果此類別中的物件在雜湊表中做為關鍵值,或是把它們插入至地圖或設定中,那麼相等物件有相等的雜湊碼是很重要的。

範例 1:以下的類別替換了 equals(),但是沒有替換 hashCode()


public class halfway() {
public boolean equals(Object obj) {
...
}
}
References
[1] D. H. Hovermeyer FindBugs User Manual
[2] MET09-J. Classes that define an equals() method must also define a hashCode() method CERT
[3] Standards Mapping - Common Weakness Enumeration CWE ID 581
desc.structural.java.object_model_violation_just_one_of_equals_hashcode_defined