[解決済み] Apache Commons equals/hashCode builder [終了しました]。
質問
を使うことについてどう思うか、知りたいと思っています。
org.apache.commons.lang.builder
EqualsBuilder
/
HashCodeBuilder
を実装するためのものです。
equals
/
hashCode
? 自分で書くより良い方法でしょうか?Hibernateと相性が良いのか?あなたの意見はどうですか?
どのように解決するのですか?
コモンズ/ラングビルダーは素晴らしく、私は何年も使っていますが、目立ったパフォーマンスのオーバーヘッドもありません(ハイバーネートの有無にかかわらず)。しかし、Alainが書いているように、Guavaの方法はさらに素晴らしいです。
Beanのサンプルはこちらです。
public class Bean{
private String name;
private int length;
private List<Bean> children;
}
Commons/Langで実装したequals()とhashCode()を紹介します。
@Override
public int hashCode(){
return new HashCodeBuilder()
.append(name)
.append(length)
.append(children)
.toHashCode();
}
@Override
public boolean equals(final Object obj){
if(obj instanceof Bean){
final Bean other = (Bean) obj;
return new EqualsBuilder()
.append(name, other.name)
.append(length, other.length)
.append(children, other.children)
.isEquals();
} else{
return false;
}
}
で、こちらはJava 7以上(Guavaに触発された)。
@Override
public int hashCode(){
return Objects.hash(name, length, children);
}
@Override
public boolean equals(final Object obj){
if(obj instanceof Bean){
final Bean other = (Bean) obj;
return Objects.equals(name, other.name)
&& length == other.length // special handling for primitives
&& Objects.equals(children, other.children);
} else{
return false;
}
}
注:このコードは元々Guavaを参照していましたが、コメントで指摘されたように、この機能はその後JDKに導入されたので、Guavaはもはや必要ではありません。
ご覧の通り、Guava/JDKバージョンはより短く、余分なヘルパーオブジェクトを避けることができます。等号の場合、もし以前の
Object.equals()
の呼び出しはfalseを返します(公平を期すため、commons / langには
ObjectUtils.equals(obj1, obj2)
メソッドの代わりに使用することができます。
EqualsBuilder
を使えば、上記のような短絡的な操作が可能になります)。
そうです、コモンズの言語ビルダーは、手動で構築された
equals()
と
hashCode()
メソッド(またはEclipseが生成するひどいモンスター)がありますが、Java 7+ / Guavaのバージョンはさらに優れています。
そして、Hibernateについての注意点です。
equals()、hashCode()、toString()の実装で遅延コレクションを使用することに注意してください。もし、Sessionを開いていないなら、それは惨めに失敗するでしょう。
注意(equals()について)。
a) 上記のequals()の両方のバージョンで、これらのショートカットの1つまたは両方を使用することもできます。
@Override
public boolean equals(final Object obj){
if(obj == this) return true; // test for reference equality
if(obj == null) return false; // test for null
// continue as above
b) equals() 契約の解釈によっては、次の行を変更することもできます。
if(obj instanceof Bean){
になります。
// make sure you run a null check before this
if(obj.getClass() == getClass()){
2番目のバージョンを使用する場合は、おそらく
super(equals())
の内部で
equals()
メソッドを使用します。ここでは意見が分かれますが、このトピックはこの質問で議論されています。
(についてですが)。
hashCode()
にも適用されます。
equals()
)
注釈 (コメント欄から着想を得ています) カヤール )
Objects.hashCode(..)
(ちょうど、その下の
Arrays.hashCode(...)
) は、多くのプリミティブ・フィールドを持つ場合、パフォーマンスが悪くなる可能性があります。そのような場合は
EqualsBuilder
は、実際にはより良い解決策である可能性があります。
関連
-
スタイルシートとして解釈されるリソースが、MIMEタイプtext/htmlで転送される。
-
[解決済み] Java enumのメンバーを比較する:==またはequals()?
-
javax.net.ssl.SSLException: 読み取りエラー: ssl=0xdeae5100: システムコール中の I/O エラー、接続 res
-
起動時にEclipseエラーが発生しました。起動中に内部エラーが発生しました。java.lang.NullPoin: "Javaツーリングの初期化 "中に内部エラーが発生しました。
-
java -serverコマンドで「Error: no `server' JVM at ... jvm.dll」を解決する方法です。
-
[解決済み] EqualsメソッドがオーバーライドされたときにGetHashCodeをオーバーライドすることが重要な理由は何ですか?
-
[解決済み] C#の==とEquals()の違いについて
-
[解決済み] JavaでequalsとhashCodeをオーバーライドする際に考慮すべき事項は?
-
[解決済み] JavaでequalsとhashCodeのメソッドをオーバーライドする必要があるのはなぜですか?
-
[解決済み】Apache Camelとは一体何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Java Error スレッド "AWT-EventQueue-0" で例外発生 java.lang.
-
javaの実行中に「javaの例外が発生しました」と表示された場合はどうすればよいですか?
-
Javaクラスローダーにソースコードから潜り込む
-
スキャナは、タイプに解決することはできません最もルーキー初心者の質問
-
JDKの設定時にjava.dllが見つからない、java SE Runtime Environmentが見つからない問題が発生しました。
-
eclipse の実行時に java 仮想マシンが見つからなかった
-
Eclipseプロンプトを実行する java仮想マシンを使用しない
-
自動配線された依存性のインジェクションに失敗しました。
-
コミットには何も追加されないが、未追跡のファイルが存在し、gitで未追跡のファイルに対する完璧な解決策
-
[解決済み】複数のフィールドでオブジェクトを比較する方法