Javaの有名なライブラリでcommons-langというのがある。この中にEqualsBuilderというequals()メソッドを簡単に実装するための便利クラスがある(HashCodeBuilder, ToStringBuilderというクラスもある)。使い方はこんな感じ。
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
} else if (!(o instanceof MyClass)) {
return false;
}
MyClass other = (MyClass)o;
return new EqualsBuilder()
.append(this.field1, o.field1)
.append(this.field2, o.field2)
.build();
}
便利なので愛用してるんだけど、普通にequals()を実装した場合と比べてパフォーマンス的にどうなの?っていうのが気になったのでベンチマークを取ってみた。ちなみに、EqualsBuilder.reflectionEquals()というリフレクションを使うバージョンもあるので、あわせて調べてみた。
結果
下記の3パターンで10万回equals()を呼び出してベンチした結果(ベンチマークのコード)
実装かかった時間(ミリ秒)
EqualsBuilderを使わない普通の実装44
EqualsBuilderを使った実装50
EqualsBuilder.reflectionEqualsを使った実装807
結論としては
- EqualsBuilderを使わない場合と使った場合でほとんど差がないのでEqualsBuilderは積極的に使うべし
- 当たり前だけどリフレクションを使うと遅い。ただ、10万回呼び出して807ミリ秒なので、ケース・バイ・ケースで使えばいいと思う。
になるのかなぁと。reflectionEqualsは1行でequals()の処理がかけてしまい麻薬的に便利なので、使えるところでは使ってもいいんじゃないかと思った次第。