界: API Abuse

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

Poor Style: Explicit Call to finalize()

Abstract
finalize() 方法只能在物件回收後才能由 JVM 進行呼叫。
Explanation
儘管 Java 語言規範中允許外部終結器呼叫物件的 finalize() 方法,但是這麼做不是一個好辦法。例如,直接呼叫 finalize() 表示會不只一次呼叫 finalize() 方法:第一次將會直接呼叫,而最後一次呼叫會在物件回收之後執行。

範例 1: 下列的程式碼片段直接呼叫 finalize()


// time to clean up
widget.finalize();
References
[1] MET12-J. Do not use finalizers CERT
[2] Standards Mapping - Common Weakness Enumeration CWE ID 586
desc.structural.java.poor_style_explicit_call_to_finalize