Effective Java Item 40:一致地使用 @Override 註解
整理 Effective Java 書中 Item 40: Use @Override annotations 心得筆記
主旨
在 Java 裡,如果你要「覆寫(override)」父類別或介面的某個方法,請務必加上 @Override 註解。這個小小的標記,不只是告訴編譯器「我想要覆寫」,更是一道保險機制,可以幫助你避免不小心寫出錯誤的程式碼。
點出問題
假設我們寫了一個類別,想要覆寫 equals 方法,但不小心拼錯了方法名稱:
public class Dog {
public boolean equals(Dog d) {
// 錯誤:這不是覆寫 Object 的 equals 方法
return true;
}
}
這段程式碼表面上沒錯,但實際上並沒有覆寫 Object 的 equals(Object obj),因為參數型別不同。這會導致預期行為錯誤,卻不會有任何編譯錯誤。
加上 @Override 註解後,編譯器會幫你檢查是否真的有成功覆寫:
public class Dog {
@Override
public boolean equals(Dog d) { // 編譯錯誤:這其實不是覆寫
return true;
}
}
劃重點
@Override不是裝飾用,它的作用是讓編譯器幫你驗證覆寫正確性。- 如果你漏掉
@Override,Java 編譯器不會警告你,就可能埋下 bug。 - 對於 實作介面的方法也要加上
@Override,尤其從 Java 6 以後,這已經是被支持的用法。
public class MyRunnable implements Runnable {
@Override
public void run() {
System.out.println("Running!");
}
}
真實世界範例
在企業專案中,我曾看過有人忘記加 @Override,導致父類的某個方法沒被正確覆寫,最後系統的權限判斷邏輯整個失效。這種錯誤通常難以察覺,若當時加上註解,編譯器就會直接提示,節省大量除錯時間。
小結
只要你要覆寫父類或介面的任何方法,就加上 @Override。這個習慣不僅能幫助你快速抓出錯誤,也讓程式碼更具可讀性與一致性。這不是畫蛇添足,而是一種專業工程師應有的基本防線。
Read other posts