정적 팩터리 메서드의 장점

public class Order {
		private boolean prime;
		private boolean urgent;
		private Product product;

		public Order(Product product, boolean prime) {
				this.product = product;
				this.prime = prime;
		}

		public Order(Product product, boolean urgent) {
				this.product = product;
				this.urgent = urgent;
		}
}

이러한 경우엔 보통 생성자 순서를 바꿔 우회한다.

public class Order {
		private boolean prime;
		private boolean urgent;
		private Product product;

		public Order(Product product, boolean prime) {
				this.product = product;
				this.prime = prime;
		}

		public Order(boolean urgent, Product product) {
				this.product = product;
				this.urgent = urgent;
		}
}

이러한 경우 생성자의 이름을 표현할 수 없다. (무조건 이름이 고정)

public class Order {
		private boolean prime;
		private boolean urgent;
		private Product product;

		public **Order**(Product product, boolean prime) {
				this.product = product;
				this.prime = prime;
		}

		public **Order**(Product product, boolean urgent) {
				this.product = product;
				this.urgent = urgent;
		}
}

<aside> 💡 그렇다면 어떻게 만들어야 좋은 코드인가?

</aside>

우리는 이미 파라미터로 알고 있다.

public class Order {
		private boolean prime;
		private boolean urgent;
		private Product product;

		public Order(Product product, boolean prime) {
				this.product = product;
				this.prime = prime;
		}

		public Order(Product product, boolean urgent) {
				this.product = product;
				this.urgent = urgent;
		}
}

정적 팩터리 메서드를 사용했을 때의 첫 번째 장점

public class Order {
		private boolean prime;
		private boolean urgent;
		private Product product;

		// 기본 생성자는 자동으로 만들어짐.
		/*
		public Order() {

		}
		
		public Order(Product product, boolean prime) {
				this.product = product;
				this.prime = prime;
		}

		public Order(boolean urgent, Product product) {
				this.product = product;
				this.urgent = urgent;
		}
		*/

		public static Order primeOrder(Product product) {
				Order order = new Order();
				order.prime = true;
				order.product = product;
				return order;
		}

		public static Order urgentOrder(Product product) {
				Order order = new Order();
				order.urgent = true;
				order.product = product;
				return order;
		}
}

정적 팩터리 메서드를 사용했을 때의 두 번째 장점

public class Settings {
		private boolean useAutoSteering;
		private boolean useABS;
		private Difficulty difficulty;
}

자바의 생성자는 매번 호출될 때마다 새로운 인스턴스를 만든다.

따라서 아무런 생성자를 만들지 않았더라도 이미 해당 생성자를 사용할 수 있다.

→ 매번 새로운 인스턴스가 만들어질 것임. (출력했을 때 해시코드가 서로 다른 것을 알 수 있다.)