Lombok でできること確認します。( @EqualsAndHashCode )

2021年5月6日

先日の投稿に引き続き、 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でも出題されるくらい大事なメソッドなので
よく理解しておいたほうがよいですよ。

今日はここまで!