15

FindBugsと呼ばれる静的分析ツールを使用して次のコードを分析しています。

if(str.equals(enum.SOMEVALUE)) {// do something};

ここで、strは文字列、enumは列挙型です。ツールは、このコードに対して次の警告を生成し、次のように記述します

このメソッドは、共通のサブクラスを持たない異なるクラスタイプの2つの参照に対してequals(Object)を呼び出します。equals()のコントラクトによれば、異なるクラスのオブジェクトは常に等しくないものとして比較する必要があります。したがって、java.lang.Object.equals(Object)で定義されたコントラクトによれば、この比較の結果は実行時に常にfalseになります。

上記のコード行を次のように置き換えると、次のようになります。

if(str.equals(enum.SOMEVALUE.toString())) {// do something};

その後、警告は消えますが、ツールが生成する警告が本当に正しいかどうか、そしてそれを正しい方法で修正しているかどうかはわかりませんか?私は以前にそのような比較を見たことがあり、それは正しく機能しているように見えるからです。

4

5 に答える 5

19

あなたの最初の比較は基本的に間違っています。完全に異なるタイプ(StringおよびEnum)のオブジェクトを比較しているので、それらが等しくなることはありません。はここで私に警告さえ与えます。equals()を受け入れるためにのみコンパイルされ、。はコンパイルされObjectませんString

2番目の比較は正しいです。

JavaDocはメソッドに対して少し厳しいですが、name()列挙型がtoString()オーバーライドされた場合に備えて、実際にJavaDocを使用することをお勧めします。

if(str.equals(FooEnum.SOMEVALUE.name()))
于 2012-05-11T14:49:18.470 に答える
3

の定数を置き換えるのtoString()は正しいことだと思いますが.name()、toStringがオーバーライドされるため、定数を変更します。

于 2012-05-11T14:50:10.947 に答える
3

あなたが試すことができます

enum.SOMEVALUE.name()

そのまま

enum宣言で宣言されているとおりに、このenum定数の名前を返します。

于 2012-05-11T14:50:40.547 に答える
2

私は使用することをお勧めします:

if (SomeEnum.SOMEVALUE == SomeEnum.valueOf(str)) {

}
于 2012-05-11T14:49:20.420 に答える
1

私の知る限り、あなたは正しい道を進んでいます。

if(str.equals(enum.SOMEVALUE.toString())) {// do something};

これは大丈夫なはずです。

于 2012-05-11T14:50:27.050 に答える