IntelliJはコードに潜在的なバグがあると思っています。これは、Nonnull
注釈と関係があります。私はIntelliJに、いくつかのフィールドがnullにならないことを伝えています。そして、それらが決してnullになることを許さないことを保証していますが、IntelliJはそれを好きではありません。なぜIntelliJのインスペクタはこのコードを強調していますか?
ここに問題のコードの例を示します。
import javax.annotation.Nonnull;
public class Something {
static final Long DEFAULT_ID = -1L;
@Nonnull
public Long id;
public Something() {
id = DEFAULT_ID;
}
@Nonnull
public Long getId() {
return this.id;
}
public Something setId(Long id) {
this.id = id != null ? id : DEFAULT_ID;
return this;
}
}
私はこれを行うと、IntelliJののインスペクタがid
のクラスフィールドはNonnull
でアノテートされていることを私に警告し、setId(Long)
メソッドプロトタイプのid
パラメータに警告を生成します。これは私にもかかわらず、必要に応じてメソッド&を処理するメソッドの本体でnullを手動でチェックしています。 Something#id
はこのメソッドでnullになることはありません。私はこのようなことをする方法を変更した場合
しかし、検査の警告が完全に消える:
理論的にはpublic Something setId(Long id) {
if (id != null)
this.id = id;
else
this.id = DEFAULT_ID;
return this;
}
は、両方の実装が効果的に同じです。 IntelliJは、私がif-elseアプローチをとったときに、三項演算子を使用することを推奨しています。なぜIntelliJは三項演算子を使用して、最初の実装について警告を出しますか?これはコードインスペクタの見落としですか、またはここで重要なものがありませんか? "NullableProblems"を抑制することで警告を抑止することができますが、ここでは三項演算子を使って何か問題がないことを確認したいと思います。何かアドバイス?
私は実際には最初のもののために何の警告が表示されません。さらに、 '@ Nonnull'の代わりに' org.jetbrains.NotNull'が使用されることが通知されています。 – Makoto
@Makotoあなたは良い点を挙げます。私はIDEの代わりにjavaxアノテーションを使用するように設定しました。その設定を元に戻してみて、JetBrainsブランドのアノテーションが何らかの動作をするかどうかを確認する必要があります。 – nasukkin