2

@Nullableチェッカー フレームワークと型注釈を使用して、とが正しく使用されていることを確認しています@NonNull。Map のようなクラス1では、Java 仕様では、マップにそのキーのエントリが含まれていない場合にget(…)-methods が返されると規定されています。nullしたがって、メソッドには@Nullable- 注釈があります。ただし、contains(…)返品する場合は、返品しないことtrueを保証したいと思います。get(…)null

条件付きのNonNullを指定するにはどうすればよいですか?

私の知る限り、次のようにcontains(…)-methods に注釈を付けることでこれを実現できます。@EnsuresNonNullIf

@Pure
@EnsuresNonNullIf(expression = {"get(#1)", "getMatchingStoredKey(#1)", "getStrict(#1)", "lookup(#1)"}, result = true)
public boolean containsKeyStrict(final @Nullable Class<? extends TKeyClass> key) {
    return super.containsKey(key);
}

@Pure
public @Nullable TValue getStrict(final @Nullable Class<? extends TKeyClass> key) {
    Return super. gets (key);
}

ただし、これにより警告が発生します。

the conditional postcondition about 'this.getStrict(key)' at this return statement is not satisfied

この「事後条件が満たされていない」という警告をどのように解決すればよいですか?

私の環境:

  • メイヴン: 3.0.4
  • Java: 1.7.0_25 (オラクル)
  • チェッカー フレームワーク 1.7.0 (maven プラグイン経由)

この Gistは問題を示しています。


1) マップの機能を拡張して、「類似の」キーを持つエントリを取得します。

4

2 に答える 2

0

これまでのところ、私の唯一の解決策は、@EnsuresNonNullIf- 注釈をSuppersWarnings("nullness"). 例えば:

@SuppressWarnings("nullness")
@EnsuresNonNullIf(expression = {"get(#1)", "getMatchingStoredKey(#1)", "getStrict(#1)", "lookup(#1)"}, result = true)
public boolean containsKeyStrict(final @Nullable Class<? extends TKeyClass> key) {
    return super.containsKey(key);
}

スコープを@SuppressWarnings設定するには、@EnsuresNonNullIf アノテーションが付けられていないメソッドに実装を委任できます。

于 2014-01-27T16:24:28.433 に答える
0

あなたが言う時

Java 仕様では、マップにそのキーのエントリが含まれていない場合、get(…) メソッドは null を返すと規定されています。

あなたは正しいが、部分的にしか正しくない、ここをチェックしてください、javadocの状態、

このマップが null 値を許可する場合、null の戻り値は必ずしもマップにキーのマッピングが含まれていないことを示しているわけではありません。マップが明示的にキーを null にマップすることも可能です。これら 2 つのケースを区別するために、containsKey 操作を使用できます。

つまり、キーを null 値にマッピングしている場合、メソッドcontainsKeyStrictは を返す可能性がありますが、そのキーの値がないためではなく、そのキーの値が正確であるため、trueメソッドgetStrictは を返します。nullnull

必要な種類の動作を強制するには、null 値 (またはキー) を許可しないHashTableを使用するか、メソッドに検証を追加して、マップに値putが挿入されないようにすることができます。null

于 2014-02-06T06:52:10.443 に答える