整理 Effective Java 書中 Item 40: Use @Override annotations 心得筆記

主旨

在 Java 裡,如果你要「覆寫(override)」父類別或介面的某個方法,請務必加上 @Override 註解。這個小小的標記,不只是告訴編譯器「我想要覆寫」,更是一道保險機制,可以幫助你避免不小心寫出錯誤的程式碼。

點出問題

假設我們寫了一個類別,想要覆寫 equals 方法,但不小心拼錯了方法名稱:

public class Dog {
    public boolean equals(Dog d) {
        // 錯誤:這不是覆寫 Object 的 equals 方法
        return true;
    }
}

這段程式碼表面上沒錯,但實際上並沒有覆寫 Objectequals(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。這個習慣不僅能幫助你快速抓出錯誤,也讓程式碼更具可讀性與一致性。這不是畫蛇添足,而是一種專業工程師應有的基本防線。