![](/img/trans.png)
[英]Should I mark both the interface and its implementation with the @NonNull annotation?
[英]Do I need to @Nonnull again at the implementation?
雖然我認為應該有一個繼承注釋的一般規則,但我特別感興趣的是讓FindBugs識別我的規則,所以這個問題是特定於FindBugs的。
AFAIK,JavaDoc注釋來自接口,在實現時被忽略。 這個概念是否也適用於@Nonnull
(或@NotNull
)等注釋?
給定@Override
注釋,至少可以添加接口上不存在的其他注釋。
在下列情況下會發生什么? FindBugs會識別所有這些嗎? 關於清潔代碼,哪一個是首選的?
@Nonnull
,實現@Override
@Nonnull
,實現@Override
@Nonnull
, @Override
@Nonnull
@Override,
@ Nonnull` 選擇2:
- 接口@Nonnull,實現@Override @Nonnull
FindBugs和許多其他工具(如IDE)如果在正確的位置找到注釋,則可以做得更好。 這些注釋不是繼承的,正如本節底部的JLS所述:
注釋繼承僅適用於類(不是方法,接口或構造函數)
所以工具需要自己去尋找它們。 哪些工具可以做到,但即使是FindBugs也不能做到這一點(最后我檢查過)。
接口上的注釋聲明所有實現都不能返回null
而實現上的實現表明它遵守該合同。 它不是遺傳的,我認為也不是。
@CheckForNull
注釋肯定不會被繼承,因為允許子類縮小返回類型的null,就像它們可以為它們接受的參數加寬它一樣。
interface Credentials {
@NonNull
String getPassword();
void setPassword(@NonNull password);
}
// Allows null password
class GoodCreds implements Credentials {
// but cannot widen; throw exception for null instead
@Overrides
@NonNull
String getPassword() {...}
// can widen parameters
@Overrides
void setPassword(@CheckForNull password) {...}
}
注意:我將添加匹配的用戶名訪問器,以便在我稍后有時間時在
BadCreds
子類中演示錯誤的擴展。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.