java.lang.Override是標準的Annotation型態之一,它告知編譯器某個方法必須是重新定義父類別或實作介面的方法,編譯器得知這項資訊後,在編譯程式時如果發現該方法 並非重新定義父類別或實作介面中的方法,就會回報錯誤。
例如,在重新定義Thread的run()方法時:
public class SomeThread extends Thread {
public void Run() {
//...
}
}
public void Run() {
//...
}
}
編譯時,不會有任何錯誤,即使你的run()打成了Run(),編譯器只會當你定義了一個新方法Run(),你並沒有真的重新定義run()。為了避免這類錯誤,可以加上@Override:
public class SomeThread extends Thread {
@Override
public void Run() {
//...
}
}
@Override
public void Run() {
//...
}
}
在編譯程式時,編譯器看到@Override這個Annotation,瞭解它必須檢查這個方法是不是重新定義父類別的Run()方法,但父類 別中並沒有這個方法,所以它會回報錯誤:
SomeThread.java:2: method does not override a method from its superclas
@Override
^
1 error
@Override
^
1 error
重新修改一下程式,編譯時就不會有問題了:
public class SomeThread extends Thread {
@Override
public void run() {
//...
}
}
@Override
public void run() {
//...
}
}
java.lang.Deprectated對編譯器說明某個方法已經不建議使用,如果有人試圖使用或重新定義該方法,必須提出警示訊息。
舉個例子來說,您可能定義一個CustomObject類別,並在當中定義有getSomething()方法,而在一段時間之後,您不建議使用這個方法 了,並要將這個方法標示為deprectated,您可以這麼作 :
public class CustomObject {
@Deprecated
public String getSomething() {
// ...
return "something";
}
}
@Deprecated
public String getSomething() {
// ...
return "something";
}
}
如果有人試圖在繼承這個類別後重新定義getSomething(),或是在程式中呼叫使用getSomething()方法,則進行編譯時,就會出現這 個警訊:
Note: SubCustomObject.java uses or overrides a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
Note: Recompile with -Xlint:deprecation for details.
想要知道詳細的警訊內容的話,可以在編譯時加上-Xline:deprecation引數,例如:
>javac -Xlint:deprecation SubCustomObject.java
SubCustomObject.java:5: warning: [deprecation] getSomething() in CustomObject ha s been deprecated
object.getSomething();
^
1 warning
SubCustomObject.java:5: warning: [deprecation] getSomething() in CustomObject ha s been deprecated
object.getSomething();
^
1 warning
java.lang.SuppressWarnings對編譯器說明某個方法中若有警示訊息,則加以抑制,不用在編譯完成後出現警訊。
在這邊到說明SuppressWarnings的功能,考慮下面這個類別:
public class SomeObject {
public void doSomething() {
Map map = new HashMap();
map.put("some", "thing");
}
}
public void doSomething() {
Map map = new HashMap();
map.put("some", "thing");
}
}
在J2SE 5.0中加入了集合物件的Generics支援,並建議您明確的指定集合物件將內填的物件之型態,在上面這個類別中使用Map時並沒有指定內填物件之型 別,在編譯時會出現以下的訊息:
Note: SomeObject.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
Note: Recompile with -Xlint:unchecked for details.
在編譯時一併指定-Xlint:unchecked可以看到警示的細節:
SomeObject.java:7: warning: [unchecked] unchecked call to put(K,V) as a member o f the raw type java.util.Map
map.put("some", "thing");
^
1 warning
map.put("some", "thing");
^
1 warning
如果你想讓編譯器忽略這些細節,則可以如下使用@SuppressWarnings這個Annotation:
public class SomeObject {
@SuppressWarnings(value={"unchecked"})
public void doSomething() {
Map map = new HashMap();
map.put("some", "thing");
}
}
@SuppressWarnings(value={"unchecked"})
public void doSomething() {
Map map = new HashMap();
map.put("some", "thing");
}
}
這麼一來,編譯器將忽略掉"unckecked"的警訊,你也可以指定忽略多個警訊:
@SuppressWarnings(value={"unchecked", "deprecation"})