2011-08-05 17 views
15

単純なデータPOJOの場合equals()およびhashCode()を実装すると、コードが乱雑になり、保守が面倒です。Java:自動equals()およびhashCode()

これを自動的に処理するライブラリは何ですか?
パフォーマンス上の理由により、私はバイトコード計測をAOPアプローチよりも好む

更新:等号を実装する必要のトピック()とhashCode()が議論されている、ここでの私のポイントがあります:

は、それが最小限の労力ではなく、中掘りで先行右行っている方が良いではないですコードは、それになるとhC/eqを追加しますか?

+4

ライブラリは 'equals'の面倒を見ることができません - あなたは2つのオブジェクトを等しくするものだけを知っています。あなたのために 'hashCode'を生成しないIDEを使用していますか?そしてなぜあなたは 'equals'と' hashCode'で多くのメンテナンスをしなければなりませんか? – Paul

+1

私はJavaコミュニティでは、基本的にすべてのPOJOに対してこれらのメソッドを実装するのが一般的だと理解していますが、実際にはPOJOのすべての型をハッシュテーブルのキーとして使用していますか?あなたはそれらを平等のために比較していますか?そうでない場合は、なぜさらに気になるのでしょうか? –

+0

@Paul - NetBeansで生成されます。私は毎回再生成しなければなりません。また、10行のコード行を作成します。また、libは生成時にリフレクションを使用する可能性があるので、なぜそれが等しく扱えないのでしょうか? –

答えて

10

Project Lombokは、Javaクラスのequals()hashCode()を生成する注釈@EqualsAndHashCodeを提供します。もちろん、これらのメソッドを手動で実装するのに比べていくつかの欠点があります。リンクされたページの "小さな印刷"を必ず読んでください。

+0

それはおそらく私が探しているものです。残念ながら、NetBeansと統合されていません。 –

3

GuavaObjects.hashCodeObjects.equalはどうですか?

+0

Nah ...しかし、私が最終的にそれが可能なことを確認してくれてありがとう。 –

1

Apache commons-langライブラリには、HashCodeBuilderとEqualsBuilderが用意されています。これらは、あなたのためにいくつかの作業を行い、それらのメソッドを短縮します。 POJOのフィールドに基づいてあなたのためにすべてを行うリフレクションバージョンもあります。しかし、私はそれをお勧めしません。リフレクションは遅くなることがあります(ただし、多くの人が考えるように悪くない)。正しいフィールドだけが等しいかどうかを確認するためにリフレクションを実装する必要があります。

私の質問は、本当にこれを行う必要がありますか?多くの場合、POJOのハッシュコードと等価はマップやセットで使用するために実装する必要があります。マップの場合、通常、Pojo自体ではないキーにIDを使用します。だから、あなたは自分で仕事をしていますか?

+0

+1は2段落目ですが、コードを掘り下げてhC/eqを追加するのではなく、最小限の努力で直前に行うほうがいいですか? –

+0

すべてのもののように、それはトレードオフに終わる。それは前に完了しているといいですが、実際に必要なときに実装することは、私の経験ではあまりにも困難であるとは証明されていません。もちろん、私はいつも私がそれを実装するのを忘れていたことを教えてくれるテストを持っています。 :) – rfeak

2

あなたは自動的にequalshashCodeで不変の値クラスを生成するために、GoogleのAutoValueライブラリを使用することができます。これらの値クラスは、ScalaのケースクラスやLombokで生成されたクラスと多少似ています。

IDEでの使用方法については、postもあります。

+1

IntelliJについては、https://plus.google.com/+googleguava/posts/i9sRnkDKcdTを参照してください。 –

関連する問題