Lombok でできること確認します。( @EqualsAndHashCode )
先日の投稿に引き続き、 Lombok の機能を見ていきたいと思います。
今回は @EqualsAndHashCode です。
同じ・・・とは?
オブジェクト同士の比較って実はよく使用しますよね?
例えば・・・
package com.example.demo;
import lombok.Getter;
import lombok.Setter;
@Getter @Setter
public class HogeLombok {
private int age;
private String name;
private String hobby;
}
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
HogeLombok v01 = new HogeLombok();
v01.setAge(11);
v01.setName("太郎");
v01.setHobby("野球");
HogeLombok v02 = new HogeLombok();
v02.setAge(11);
v02.setName("太郎");
v02.setHobby("野球");
System.out.println("v01 hash :" + v01.hashCode());
System.out.println("v02 hash :" + v02.hashCode());
System.out.println("v01 と v02 は同一人物? :" + v01.equals(v02));
System.out.println("v01 = v02 ? :" + (v01 == v02));
}
}
v01とv02のオブジェクトを生成してそれぞれ同一の値を入力しました。
確認してみる
結果は御覧の通りです。
上記の結果は超簡単に言うと、「v01とv02は年齢も趣味も同じだが2人とも別人である」という結果です。
各オブジェクトのhashCodeメソッドは何も手を加えていないとObjectクラスのhashCodeメソッドを実行します。
このメソッドが返す値は「オブジェクトを特定するためのユニークは値」、いわば住所のような値を返すことになっています。
開発では「オブジェクトの住所が同じか?」ではなく、「同じ太郎君なのか?」という問題を解決したいことがほとんどです。
Lombok の @EqualsAndHashCode
そこで Lombok の @EqualsAndHashCode の出番です。
このアノテーションを実装すると、equalsメソッドとhashCodeメソッドをオーバーライドしてくれます。
インスタンスメンバを総動員してequals, hashCodeをオーバーライドしてくれるそうです!
具体的な手順はLombok活用法(JUnitを中心に説明)の言葉を引用させていただきます。
1. 引数のNullチェック
2. 引数が同じクラスで作成されたインスタンスか?
3. (この精査は別途protected boolean canEqual(Object other)というメソッドが作成されるので、継承先でoverride可能)
3. フィールドがすべて同じか?
なるほど・・・自分で実装するとかなり大変ですね😎
@EqualsAndHashCode を使ってみる
実際に使ってみましょう。
修正する部分はHogeLombokクラスだけです。
package com.example.demo;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;
@Getter @Setter
@EqualsAndHashCode
public class HogeLombok {
private int age;
private String name;
private String hobby;
}
確認してみよう
では実行してみましょう。
うまくいきましたね???
よく見ると v01 = v02 はfalseとなってしまいましたね。
この部分は v01 == v02 の実装でした。
この比較では「同じ参照先か?」という比較になります。
したがって、「一見v01とv02は同じ太郎君だがよーーーく見るとやはり別人」ということになるでしょうか。
しかしながらオブジェクト比較では理解している人ならばequalsメソッド使いますよね!(投げやり)
まとめ
Lombok の @EqualsAndHashCode を試してみました。
この部分は equalsとhashCode は Java Silverでも出題されるくらい大事なメソッドなので
よく理解しておいたほうがよいですよ。
今日はここまで!
ディスカッション
コメント一覧
まだ、コメントがありません