9.Java註解(Annotation)

一.系統內置標準註解html

1.@Override 是一個標記註解類型,它被用做標註方法。java

它說明了被標註的方法重載了父類的方法,起到了斷言的做用。若是咱們使用了這種Annotation在一個沒有覆蓋父類方法的方法時,java編譯器將以一個編譯錯誤來警示。這個annotaton經常在咱們試圖覆蓋父類方法而確又寫錯了方法名時發揮威力。使用方法極其簡單:在使用此annotation時只要在被修飾的方法前面加上@Override便可。編程

2.@Deprecated,標記已過期安全

  同 樣Deprecated也是一個標記註解。當一個類型或者類型成員使用@Deprecated修飾的話,編譯器將不鼓勵使用這個被標註的程序元素。並且這種修飾具備必定的 「延續性」:若是咱們在代碼中經過繼承或者覆蓋的方式使用了這個過期的類型或者成員,雖然繼承或者覆蓋後的類型或者成員並非被聲明爲 @Deprecated,但編譯器仍然要報警。ide

  值得注意,@Deprecated這個annotation類型和javadoc中的 @deprecated這個tag是有區別的:前者是java編譯器識別的,然後者是被javadoc工具所識別用來生成文檔(包含程序成員爲何已通過 時、它應當如何被禁止或者替代的描述)。函數式編程

  在java5.0,java編譯器仍然象其從前版本那樣尋找@deprecated這個javadoc tag,並使用它們產生警告信息。可是這種情況將在後續版本中改變,咱們應在如今就開始使用@Deprecated來修飾過期的方法而不是 @deprecated javadoc tag。函數

3.SuppressWarnnings,抑制編譯器警告:工具

  @SuppressWarnings 被用於有選擇的關閉編譯器對類、方法、成員變量、變量初始化的警告。在java5.0,sun提供的javac編譯器爲咱們提供了-Xlint選項來使編譯器對合法的程序代碼提出警告,此種警告從某種程度上表明瞭程序錯誤。例如當咱們使用一個generic collection類而又沒有提供它的類型時,編譯器將提示出"unchecked warning"的警告。一般當這種狀況發生時,咱們就須要查找引發警告的代碼。若是它真的表示錯誤,咱們就須要糾正它。例如若是警告信息代表咱們代碼中的switch語句沒有覆蓋全部可能的case,那麼咱們就應增長一個默認的case來避免這種警告。
  有時咱們沒法避免這種警告,例如,咱們使用必須和非generic的舊代碼交互的generic collection類時,咱們不能避免這個unchecked warning。此時@SuppressWarning就要派上用場了,在調用的方法前增長@SuppressWarnings修飾,告訴編譯器中止對此方法的警告。
  SuppressWarning不是一個標記註解。它有一個類型爲String[]的成員,這個成員的值爲被禁止的警告名。對於javac編譯器來說,被-Xlint選項有效的警告 名也一樣對@SuppressWarings有效,同時編譯器忽略掉沒法識別的警告名。 @SuppressWarnings(value={ "rawtypes", "unchecked" })學習

@SuppressWarnings({ "rawtypes", "unchecked" })spa

@SuppressWarnings("unused") 

抑制警告的關鍵字 

  • all to suppress all warnings (抑制全部警告)
  • boxing to suppress warnings relative to boxing/unboxing operations(抑制裝箱、拆箱操做時候的警告)
  • cast to suppress warnings relative to cast operations (抑制映射相關的警告)
  • dep-ann to suppress warnings relative to deprecated annotation(抑制啓用註釋的警告)
  • deprecation to suppress warnings relative to deprecation(抑制過時方法警告)
  • fallthrough to suppress warnings relative to missing breaks in switch statements(抑制確在switch中缺失breaks的警告)
  • finally to suppress warnings relative to finally block that don’t return (抑制finally模塊沒有返回的警告)
  • hiding to suppress warnings relative to locals that hide variable()
  • incomplete-switch to suppress warnings relative to missing entries in a switch statement (enum case)(忽略沒有完整的switch語句)
  • nls to suppress warnings relative to non-nls string literals(忽略非nls格式的字符)
  • null to suppress warnings relative to null analysis(忽略對null的操做)
  • rawtypes to suppress warnings relative to un-specific types when using generics on class params(使用generics時忽略沒有指定相應的類型)
  • restriction to suppress warnings relative to usage of discouraged or forbidden references
  • serial to suppress warnings relative to missing serialVersionUID field for a serializable class(忽略在serializable類中沒有聲明serialVersionUID變量)
  • static-access to suppress warnings relative to incorrect static access(抑制不正確的靜態訪問方式警告)
  • synthetic-access to suppress warnings relative to unoptimized access from inner classes(抑制子類沒有按最優方法訪問內部類的警告)
  • unchecked to suppress warnings relative to unchecked operations(抑制沒有進行類型檢查操做的警告)
  • unqualified-field-access to suppress warnings relative to field access unqualified (抑制沒有權限訪問的域的警告)
  • unused to suppress warnings relative to unused code  (抑制沒被使用過的代碼的警告) 

4.@SafeVarargs

參數安全類型註解。它的目的是提醒開發者不要用參數作一些不安全的操做,它的存在會阻止編譯器產生 unchecked 這樣的警告。它是在 Java 1.7 的版本中加入的。

@SafeVarargs // Not actually safe! 
public static void m(List<String>... stringLists) {
   Object[] array = stringLists; 
   List<Integer> tmpList = Arrays.asList(42); 
  array[0] = tmpList; // Semantically invalid, but compiles without warnings 
  String s = stringLists[0].get(0); // Oh no, ClassCastException at runtime! 
}

上面的代碼中,編譯階段不會報錯,可是運行時會拋出 ClassCastException 這個異常,因此它雖然告訴開發者要妥善處理,可是開發者本身仍是搞砸了。 

Java 官方文檔說,將來的版本會受權編譯器對這種不安全的操做產生錯誤警告

5.@FunctionalInterface

函數式接口註解,這個是 Java 1.8 版本引入的新特性。函數式編程很火,因此 Java 8 也及時添加了這個特性。

函數式接口 (Functional Interface) 就是一個具備一個方法的普通接口。

好比

@FunctionalInterface
public interface Runnable {
 /**
 * When an object implementing interface <code>Runnable</code> is used
 * to create a thread, starting the thread causes the object's 
* <code>run</code> method to be called in that separately executing 
* thread. 
* <p> 
* The general contract of the method <code>run</code> is that it may 
* take any action whatsoever. 
* 
*
@see java.lang.Thread#run() */ public abstract void run() }

 

咱們進行線程開發中經常使用的 Runnable 就是一個典型的函數式接口,上面源碼能夠看到它就被 @FunctionalInterface 註解。 

可能有人會疑惑,函數式接口標記有什麼用,這個緣由是函數式接口能夠很容易轉換爲 Lambda 表達式。這是另外的主題了,有興趣的同窗請本身搜索相關知識點學習。

 二.自定義註解

三.註解的提取

參考資料 http://www.cnblogs.com/peida/archive/2013/04/26/3038503.html

http://www.cnblogs.com/peida/archive/2013/04/24/3036689.html 

http://blog.csdn.net/briblue/article/details/73824058

相關文章
相關標籤/搜索