見出し画像

【Java】オブジェクト生成3パターン

こんにちは!ワーパパエトウです!
今回はタイトルにもあります通り、オブジェクト生成について3パターンご紹介したいと思います。

■テレスコーピングパターン

public class Sample02 {

	public static void main(String[] args) {
		// テレスコーピング
		Oimo oimo = new Oimo("紅あずま", 100);

	}
}

public class Oimo {
	private final String meigara; // 銘柄
	private final int value; // 値段
	private final int fat; // 重さ
	private final int size; // サイズ

	public Oimo(String meigara, int value) {
		this(meigara,value,0,0);
	}
	public Oimo(String meigara, int value, int fat) {
		this(meigara,value,fat,0);
	}
	public Oimo(String meigara, int value, int fat, int size) {
		this.meigara = meigara;
		this.value = value;
		this.fat = fat;
		this.size = size;
	}
}

テレスコーピングパターンは安全性重視で皆さんにお馴染みのパターンのため使いやすいとは思います。ただパラメータが増えるとすぐ手に負えなくなる点については問題ありです。将来パラメータが増える予測ができるものに関しては使用しない方が良いでしょう。

■JavaBeanパターン

public class Sample02 {

	public static void main(String[] args) {
		// JavaBean
		Poteto poteto = new Poteto();
		poteto.setMeigara("紅あずま");
		poteto.setValue(100);
		poteto.setFat(30);
		poteto.setSize(50);

	}
}

public class Poteto {
	private String meigara = ""; // 銘柄
	private int value = 0; // 値段
	private int fat = 0; // 重さ
	private int size = 0; // サイズ

	public Poteto() {}

	public void setMeigara(String meigara) {
		this.meigara = meigara;
	}

	public void setValue(int value) {
		this.value = value;
	}

	public void setFat(int fat) {
		this.fat = fat;
	}

	public void setSize(int size) {
		this.size = size;
	}
}

こちらはJavaBeanパターンです。可読性重視の書き方で広く使われているやり方だと思います。生成途中に不整合な状態ができる点を考えると、スレッドセーフを保証するため頭を使う必要が出てきそうです。

■Builderパターン

public class Sample02 {

	public static void main(String[] args) {
		// Builder
		Tomato tomato = new Tomato.Builder("紅あずま", 100)
				.fat(30).size(50).build();
	}
}

public class Tomato {
	private final String meigara; // 銘柄
	private final int value; // 値段
	private final int fat; // 重さ
	private final int size; // サイズ

	public static class Builder {
		// 必須パラメータ
		private final String meigara;
		private final int value;

		// オプションパラメータ
		private int fat = 0;
		private int size = 0;

		public Builder (String meigara, int value) {
			this.meigara = meigara;
			this.value = value;
		}

		public Builder fat(int val) {
			fat = val;
			return this;
		}
		public Builder size(int val) {
			size = val;
			return this;
		}

		public Tomato build() {
			return new Tomato(this);
		}
	}

	private Tomato(Builder builder) {
		meigara = builder.meigara;
		value = builder.value;
		fat = builder.fat;
		size = builder.size;
	}

}

こちらはビルダーパターンです。安全性と可読性を併せ持ったパターンとなります。初級エンジニアには馴染みのないパターンと思われますが、柔軟性がある書き方のためJavaに慣れてきたら使えるようにしていきたいですね。
ただし、必須パラメータが多いと微妙な感じも否めないところはあります。

■まとめ

どうでしたか?
テレスコーピングパターンとJavaBeanパターンは大抵の現場では使って問題ありません。
しかし残念なことに、Builderパターンに関しては周りのエンジニアのレベルによっては理解してもらえない可能性があるので注意が必要となります。

ではまた(^_^)ノシ

記事を書く合間のコーヒー代、待ってます!(*´ー`*)