と私はFindBugsのと呼ばれる静的解析ツールを使用して、以下のコードを分析しています。比較する文字列が列挙
if(str.equals(enum.SOMEVALUE)) {// do something};
ここで、strはStringであり、enumは列挙型です。ツールは、このコードと状態について次の警告を生成します。
このメソッドは、共通のサブクラスを持たない異なるクラス型の2つの参照でequals(Object)を呼び出します。 equals()の契約によれば、異なるクラスのオブジェクトは常に不等と比較されるべきです。したがって、java.lang.Object.equals(Object)で定義されているコントラクトに従って、この比較の結果は実行時に常にfalseになります。
私はこれで上記のコード行を交換する場合:
if(str.equals(enum.SOMEVALUE.toString())) {// do something};
、警告が、私はツールが生成する警告が本当であるかどうかわからないですdisappears.Butと私はそれを固定していますか正しい方法?私は前にそのような比較を見てきたので、正しく動作しているように見えます。
おかげで多くのことを。 – Bananeweizen
異なる型のオブジェクトは、equals()に基づいて確実に等しいことが許されています。 FindBugsとIntelliJの両方が間違っています。これが行われる標準のJava APIにも例があります.Listの実装は、Listの異なるサブクラスに対しても、要素を比較することによってequalsを実装します。 – herman
@herman:あなたは正しいですが、 'equals()'は* symmetric *でなければなりません。これは 'List'実装(すべては' AbstractList'に基づいています)では簡単ですが、OPケースではできません。 –