Tips

Apache Commons Javaプログラム演習問題 第6回

Apache Commons Javaプログラム演習問題 第6回

Apache Commons を利用した Java でのプログラム作成問題の6回目となります。

環境を構築していない場合は、概要を読み、環境を構築してから実施してください。

※この出題形式に関しては答えは1つではありません。
解答例はできるだけ複数載せるつもりですが、問題文の要件を満たしていれば正解として下さい。

問題

jp.pjin.tech.commons.domain.BloodType.java

package jp.pjin.tech.commons.domain;

public enum BloodType {
	A, B, O, AB
}

jp.pjin.tech.commons.domain.User.java

package jp.pjin.tech.commons.domain;

import java.io.Serializable;
import java.time.LocalDate;

public class User implements Serializable {

	private int id;
	private String name;
	private BloodType type;
	private LocalDate birthday;
	private String mail;
	private String phone;

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public BloodType getType() {
		return type;
	}

	public void setType(BloodType type) {
		this.type = type;
	}

	public LocalDate getBirthday() {
		return birthday;
	}

	public void setBirthday(LocalDate birthday) {
		this.birthday = birthday;
	}

	public String getMail() {
		return mail;
	}

	public void setMail(String mail) {
		this.mail = mail;
	}

	public String getPhone() {
		return phone;
	}

	public void setPhone(String phone) {
		this.phone = phone;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		User other = (User) obj;
		if (birthday == null) {
			if (other.birthday != null)
				return false;
		} else if (!birthday.equals(other.birthday))
			return false;
		if (id != other.id)
			return false;
		if (mail == null) {
			if (other.mail != null)
				return false;
		} else if (!mail.equals(other.mail))
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		if (phone == null) {
			if (other.phone != null)
				return false;
		} else if (!phone.equals(other.phone))
			return false;
		if (type != other.type)
			return false;
		return true;
	}

	@Override
	public String toString() {
		return "User [id=" + id + ", name=" + name + ", type=" + type + ", birthday=" + birthday + ", mail=" + mail
				+ ", phone=" + phone + "]";
	}
}

Userオブジェクトの定義を上記に示しています。
#toString, #equals は eclipseにて自動生成したものです。

Classを右クリックし、「ソース」から「hashCode()およびequals()の生成」と「toString()の生成」、「getter および setter の生成」を実行したものです。

自動生成された、equalsをcommonsを利用して書き換えてください。

解答例1

jp.pjin.tech.commons.domain.User.java

[java] package jp.pjin.tech.commons.domain;

import java.io.Serializable;
import java.time.LocalDate;

import org.apache.commons.lang3.builder.EqualsBuilder;

public class User implements Serializable {

private int id;
private String name;
private BloodType type;
private LocalDate birthday;
private String mail;
private String phone;

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public BloodType getType() {
return type;
}

public void setType(BloodType type) {
this.type = type;
}

public LocalDate getBirthday() {
return birthday;
}

public void setBirthday(LocalDate birthday) {
this.birthday = birthday;
}

public String getMail() {
return mail;
}

public void setMail(String mail) {
this.mail = mail;
}

public String getPhone() {
return phone;
}

public void setPhone(String phone) {
this.phone = phone;
}

@Override
public boolean equals(Object obj) {
return EqualsBuilder.reflectionEquals(this, obj);
}

@Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", type=" + type + ", birthday=" + birthday + ", mail=" + mail
+ ", phone=" + phone + "]";
}
}
[/java]

すっきりしたのではないでしょうか。
EqualsBuilder#reflectionEqualsを利用します。

実際ちゃんと比較できるか確認してみましょう。

jp.pjin.tech.commons.Practice006.java

[java] package jp.pjin.tech.commons;

import java.time.LocalDate;

import jp.pjin.tech.commons.domain.BloodType;
import jp.pjin.tech.commons.domain.User;

public class Practice006 {
public static void main(String[] args) {
User a = new User();
User b = new User();

System.out.println(Integer.toHexString(a.hashCode()));
System.out.println(Integer.toHexString(b.hashCode()));

if (a.equals(b)) {
System.out.println("おなじ");
} else {
System.out.println("ちがう");
}

a.setId(10);
b.setId(10);

a.setName("山田太郎");
b.setName("山田太郎");

a.setType(BloodType.A);
b.setType(BloodType.A);

a.setBirthday(LocalDate.of(2019, 1, 1));
b.setBirthday(LocalDate.of(2019, 1, 1));

a.setMail("yamada@ssie.jp");
b.setMail("yamada@ssie.jp");

a.setPhone("000-0000-0000");
b.setPhone("000-0000-0000");

if (a.equals(b)) {
System.out.println("おなじ");
} else {
System.out.println("ちがう");
}

b.setBirthday(LocalDate.of(2019, 2, 26));

if (a.equals(b)) {
System.out.println("おなじ");
} else {
System.out.println("ちがう");
}
}
}
[/java]

上記プログラムを実行すると、a, b のそれぞれのHashCodeが出力され、別インスタンスということが分かります。
そのうえで、値が全てなしの場合と、値が全てありで同じ場合と、bの誕生日のみ変更した場合で比較しています。

apache commons

Apache Commons Javaプログラム演習問題 第23回

Apache Commons を利用した Java でのプログラム作成問題の23回目となります。 環境を構築していない場合は、概要を読み、環境を構築してから実施してください。 ※この出題形式に関しては答えは1つではありません。 解答例はできるだけ複数載せるつもりですが、問題文の要件を満たしていれば正
apache commons

Apache Commons Javaプログラム演習問題 第22回

Apache Commons を利用した Java でのプログラム作成問題の22回目となります。 環境を構築していない場合は、概要を読み、環境を構築してから実施してください。 ※この出題形式に関しては答えは1つではありません。 解答例はできるだけ複数載せるつもりですが、問題文の要件を満たしていれば正
apache commons

Apache Commons Javaプログラム演習問題 第21回

Apache Commons を利用した Java でのプログラム作成問題の21回目となります。 環境を構築していない場合は、概要を読み、環境を構築してから実施してください。 ※この出題形式に関しては答えは1つではありません。 解答例はできるだけ複数載せるつもりですが、問題文の要件を満たしていれば正
apache commons

Apache Commons Javaプログラム演習問題 第20回

Apache Commons を利用した Java でのプログラム作成問題の20回目となります。 環境を構築していない場合は、概要を読み、環境を構築してから実施してください。 ※この出題形式に関しては答えは1つではありません。 解答例はできるだけ複数載せるつもりですが、問題文の要件を満たしていれば正
apache commons

Apache Commons Javaプログラム演習問題 第19回

Apache Commons を利用した Java でのプログラム作成問題の19回目となります。 環境を構築していない場合は、概要を読み、環境を構築してから実施してください。 DB環境の準備は、Apache Commons Javaプログラム演習問題 第16回をご覧ください。 ※この出題形式に関して
apache commons

Apache Commons Javaプログラム演習問題 第18回

Apache Commons を利用した Java でのプログラム作成問題の18回目となります。 環境を構築していない場合は、概要を読み、環境を構築してから実施してください。 DB環境の準備は、Apache Commons Javaプログラム演習問題 第16回をご覧ください。 ※この出題形式に関して
apache commons

Apache Commons Javaプログラム演習問題 第17回

Apache Commons を利用した Java でのプログラム作成問題の17回目となります。 環境を構築していない場合は、概要を読み、環境を構築してから実施してください。 DB環境の準備は、Apache Commons Javaプログラム演習問題 第16回をご覧ください。 ※この出題形式に関して
apache commons

Apache Commons Javaプログラム演習問題 第16回

Apache Commons を利用した Java でのプログラム作成問題の16回目となります。 環境を構築していない場合は、概要を読み、環境を構築してから実施してください。 ※この出題形式に関しては答えは1つではありません。 解答例はできるだけ複数載せるつもりですが、問題文の要件を満たしていれば正
apache commons

Apache Commons Javaプログラム演習問題 第12回

Apache Commons を利用した Java でのプログラム作成問題の12回目となります。 環境を構築していない場合は、概要を読み、環境を構築してから実施してください。 ※この出題形式に関しては答えは1つではありません。 解答例はできるだけ複数載せるつもりですが、問題文の要件を満たしていれば正
apache commons

Apache Commons Javaプログラム演習問題 第15回

Apache Commons を利用した Java でのプログラム作成問題の15回目となります。 環境を構築していない場合は、概要を読み、環境を構築してから実施してください。 ※この出題形式に関しては答えは1つではありません。 解答例はできるだけ複数載せるつもりですが、問題文の要件を満たしていれば正

新連載はじまりました!新Java基礎 連載リンク

はじめてのJAVA 連載

Recent News

Recent Tips

Tag Search