讀古今文學網 > 編寫高質量代碼:改善Java程序的151個建議 > 建議92:注意@Override不同版本的區別 >

建議92:注意@Override不同版本的區別

@Override註解用於方法的覆寫上,它在編譯期有效,也就是Java編譯器在編譯時會根據該註解檢查方法是否真的是覆寫,如果不是就報錯,拒絕編譯。該註解可以很大程度地解決我們的誤寫問題,比如子類和父類的方法名少寫了一個字符,或者是數字0和字母O未區分出來等,這基本上是每個程序員都曾經犯過的錯誤。在代碼中加上@Override註解基本可以杜絕出現此類問題,但是@Override有個版本問題,我們來看如下代碼:


interface Foo{

public void doSomething();

}

class Impl implements Foo{

@Override

public void doSomething(){

}

}


這是一個簡單的@Override示例,接口中定義了一個doSomething方法,實現類Impl實現此方法,並且在方法前加上了@Override註解。這段代碼在Java 1.6版本上編譯沒有任何問題,雖然doSomething方法只是實現了接口定義,嚴格來說並不能算是覆寫,但@Override出現在這裡可以減少代碼中可能出現的錯誤。

可如果在Java 1.5版本上編譯此段代碼,就會出現如下錯誤:


The method doSomething()of type Impl must override a superclass method Client.java


注意,這是個錯誤,不能繼續編譯。原因是1.5版中@Override是嚴格遵守覆寫的定義:子類方法與父類方法必須具有相同的方法名、輸入參數、輸出參數(允許子類縮小)、訪問權限(允許子類擴大),父類必須是一個類,不能是一個接口,否則不能算是覆寫。而這在Java 1.6就開放了很多,實現接口的方法也可以加上@Override註解了,可以避免粗心大意導致方法名稱與接口不一致的情況發生。

在多環境部署應用時,需要考慮@Override在不同版本下代表的意義,如果是Java 1.6版本的程序移植到1.5版本環境中,就需要刪除實現接口方法上的@Override註解。