2017-11-28 8 views
0

私はMap<Long, Optional<Throwable>>のインスタンスを持っています(HashMapなどの他の表現からのImmutableMap.of/copyOfを使用してインスタンス化されています)。デバッグ時にインスタンスが同じように見えますが、ユニットテストで.equalsを使用して比較しようとしています。私は問題を追跡したかもしれないが、確かめたいと思った。JavaはMapと互換性がありませんか?

https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html

これは、値ベースのクラスです。 Optionalのインスタンスでのidentity-sensitiveオペレーション(参照等価(==)、アイデンティティハッシュコード、または同期を含む)を使用すると、予期しない結果が生じる可能性があるため、避けるべきです。

私が読んだところでは、Map equalityの実装は、ほとんどの場合valueパラメータのhashcode実装に依存しているので、これが.equals呼び出しが失敗している理由が考えられますここに。しかし、これは「可能性があります」と言われているので、私はこれが基本的なユースケースではまだ有効であるかどうか、また注意が必要かどうかを知ることに興味があります。

+0

デバッグ時には、int型のように見えますが、これはここで問題になる可能性があります。そうでない場合は、[mcve]を投稿してください –

+0

比較しているインスタンスを作成する特定のコードを表示できますか? – Eran

+7

問題は「オプション」ではありません。その理由は、['equals()'](https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html#equals-java.lang .Object-)実装は、ラップされたオブジェクトに転送します。あなたの問題は、ラップされた 'Throwable'オブジェクトが(一般的に)' equals() 'を実装していないことです。 – Andreas

答えて

3

これは、値ベースのクラスである(Iはまた、多分私はデフォルトを使用している指摘しなければならないは、Eclipseソースコードジェネレータによって提供/ハッシュコードの実装に等しいです)。 Optionalのインスタンスでのidentity-sensitiveオペレーション(参照等価(==)、アイデンティティハッシュコード、または同期を含む)を使用すると、予期しない結果が生じる可能性があるため、避けるべきです。

あなたが引用している問題はまだ存在しません。警告はvalue bases classesの準備であり、Java 10以降で提供される可能性があります。


あなたの問題は何か不明ですが、確かにエキゾチックではありません。これらは、(一部のコメントから取られた)一般的な落とし穴です:彼らは2 Throwable

  • 等しい比較してはいけません:彼らは通常はequalsを実装していないよう

    • intlong
    • ThrowableOptional<Throwable>を比較を混乱しますこれはかなり無意味です

    の関連フィールドを含む単純なクラスを作成することをお勧めしますを使用し、代わりに使用してください。

  • 関連する問題