2016-07-04 84 views
0

它發生在我身上,我無意這樣做:@NotNull和@Nullable,矛盾Java註釋

@javax.annotation.Nullable 
@javax.validation.constraints.NotNull 

編譯器並沒有抱怨,一切似乎運作良好。

現在我想知道當兩個或多個註釋相互矛盾時內部發生了什麼。此外,訂單是否重要?

這是

@Nullable 
@NotNull 

比這一樣嗎?

@NotNull 
@Nullable 

這是如何工作的一般註釋?誰贏?

編輯:我在尋找一個籠統的回答,不一定是關於這兩個註解

+0

請您發佈這些註釋的完整限定名稱。你的意思是'javax.validation'註釋嗎? –

回答

4

註解本身不會爲您的代碼帶來任何邏輯。每個註釋應該使用適當的註釋處理器進行處理。註釋處理器是使註釋有意義的人。

檢查official tutorial

註釋,元數據的一種形式,提供關於節目不是程序本身的一部分的數據。註釋對他們註釋的代碼的操作沒有直接影響。

註釋有許多用途,其中包括:

  • 編譯器信息 - 註釋可以被編譯器用來檢測錯誤或取消警告。
  • 編譯時和部署時處理 - 軟件工具可以處理註釋信息以生成代碼,XML文件等等。
  • 運行時處理 - 有些註釋可在運行時檢查。

讓我們來考慮一下上面提到的2個特定的註釋。首先,它們不是互相排斥的,具有不同的性質。

@javax.annotation.NullableJSR-305的一部分,它有相反的 - @javax.annotation.Nonnull。這些註釋旨在註釋您的類字段,方法參數和方法結果。您可以將它們與代碼分析器一起使用,其中之一是Findbugs

@javax.validation.constraints.NotNullJSR-303 aka Bean Validation的一部分。所以這個註釋與@javax.annotation.Nullable沒什麼共同之處,因爲這些註釋有不同的處理器。

每次您對註釋語義有任何疑問時,都應該檢查文檔,當然您可以運行代碼並查看會發生什麼。

2

註解不會改變你的程序的意義。 Java編譯器將它們添加到程序的內部表示中(無論是在編譯期間,還是保存在類文件中,甚至是在運行時),但它都會忽略它們。特別是,它不知道「衝突」的註釋。

註解由外部工具或庫使用,它們可以以任何他們想要的方式應對衝突註釋(例如,通過打印錯誤消息)。