2017-08-28 9 views
1

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"を抑制することで警告を抑止することができますが、ここでは三項演算子を使って何か問題がないことを確認したいと思います。何かアドバイス?

+0

私は実際には最初のもののために何の警告が表示されません。さらに、 '@ Nonnull'の代わりに' org.jetbrains.NotNull'が使用されることが通知されています。 – Makoto

+0

@Makotoあなたは良い点を挙げます。私はIDEの代わりにjavaxアノテーションを使用するように設定しました。その設定を元に戻してみて、JetBrainsブランドのアノテーションが何らかの動作をするかどうかを確認する必要があります。 – nasukkin

答えて

関連する問題