상세 컨텐츠

본문 제목

2. 생성자에 매개변수가 많다면 빌더를 고려해라

😎 지식/자바☕

by :Eundms 2023. 10. 17. 19:50

본문

점층적 생성자 패턴

  • : ( 매개변수 순서 바꿔 건네줘도 런타임에 알아차리지 못한다.
class A{
	public A(int a,  int b, int c){
		this.a = a;
		this.b = b;
		this.c = c;
	}
	public A(int a, int b){
		this(a,b,0);
	}
}

자바 빈즈 패턴 (JavaBeans pattern)

  • 기본값으로 초기화하고, 세터 메서드를 이용해서 값을 변경하여 초기화하는 방법
  • : ( 객체 완성 전까지 일관성이 무너진다. 클래스를 불변으로 만들 수 없다. 스레드 안정성을 얻을 수 없다.
  • ⇒ freeze 메서드? 런타임 오류에 취약

 

빌더 패턴

 

A a = new A.Builder('ae').korean('에이').build(); 
  • 계층적으로 설계된 클래스와 함께 쓰기에 좋다
NyPizza pizza = new NyPizza.Builder(SMALL).addTopping(SAUSAGE).addTopping(ONION).build();
Calzone calzone = new Calzone.Builder().addTopping(HAM).sauceInside().build();
  • : ( 성능 문제 발생 가능. IDE의 힘을 믿고, 생성자로 초기화하는 것이 좋을 수도!

 


[  Builder 사용해서만 만들 수 있게 강제하기 ]

@Builder 사용시, @AllArgsConstructor(access = AccessLevel.PRIVATE)를 설정하여 
모든 매개변수가 있는 생성자를 숨긴다. 


public abstract class Pizza {
	public enum Toping {HAM, MUSHROOM, ONION, PEPPER, SAUSAGE }
	final Set<Topping> toppings;
	abstract static class Builder<T extends Builder<T>>{
		EnumSet<Topping> toppings = EnumSet.noneOf(Topping.class);
		public **T** addTopping(Topping topping){
			toppings.add(Objects.requireNonNull(topping));
			return **self()**;
		}
		abstract Pizza build();
		protected abstract T self();
	}
	Pizza(Builder<?> builder){toppings = builder.toppings.clone();}
}

위처럼 구현이 되어 있기 때문에, 상속 관계에서 빌더 패턴 적용에도 문제가 없다.

public abstract class Pizza {
	public enum Toping {HAM, MUSHROOM, ONION, PEPPER, SAUSAGE }
	final Set<Topping> toppings;
	abstract static class Builder<T extends Builder<T>>{
		EnumSet<Topping> toppings = EnumSet.noneOf(Topping.class);
		public **Builder<T>** addTopping(Topping topping){
			toppings.add(Objects.requireNonNull(topping));
			return **this**;
		}
		abstract Pizza build();
		protected abstract T self();
	}
	Pizza(Builder<?> builder){toppings = builder.toppings.clone();}
}

 

 

'😎 지식 > 자바☕' 카테고리의 다른 글

[Java] Enum  (0) 2024.03.11
[Java] Java 메모리 구조, Reflection,  (0) 2024.01.06
[Java] Exception, try-catch-finally, try-with-resources  (0) 2023.12.24

관련글 더보기

댓글 영역