簡體   English   中英

我是否需要在實施時再次使用@Nonnull?

[英]Do I need to @Nonnull again at the implementation?

雖然我認為應該有一個繼承注釋的一般規則,但我特別感興趣的是讓FindBugs識別我的規則,所以這個問題是特定於FindBugs的。

AFAIK,JavaDoc注釋來自接口,在實現時被忽略。 這個概念是否也適用於@Nonnull (或@NotNull )等注釋?

給定@Override注釋,至少可以添加接口上不存在的其他注釋。

在下列情況下會發生什么? FindBugs會識別所有這些嗎? 關於清潔代碼,哪一個是首選的?

  1. 接口@Nonnull ,實現@Override
  2. 接口@Nonnull ,實現@Override @Nonnull@Override @Nonnull
  3. 接口沒有注釋,實現@Override @Override, @ Nonnull`

選擇2:

  1. 接口@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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM