728x90
생성자에 매개변수가 많다면 빌더를 고려하라.
책에서는 빌더 패턴 전 시기에 2가지를 설명하고 있지만 결론은 builder를 사용하라는 것이기 때문에 builder에 대해서만 정리하였다.
빌더 패턴을 쓰면 장점
1. 빌더 패턴은 계층적으로 설계된 클래스와 함께 쓰기에 좋다.
- return 타입을 지정해서 child class에서 타입을 강제 반환 시킬 수 있다.
2. 가독성이 좋으며 build()에서 유효성 검사를 할 수 있다.
private 생성자나 열거 타입으로 싱글턴임을 보증하라.
public static 방식
public class Elvis() {
public static final Elvis INSTANCE = new Elvis();
// 생성하지 못하도록 막는다.
private Elvis() {}
public void leaveTheBuilding() {}
}
장점
- 싱글턴임을 바로 알 수 있다.
- 간결하다.
정적 팩토리 메서드
private 생성자로 생성자를 사용하지 않는다는 것을 명시 할 수 있으며, static 메서드를 통해 한 개의 객체만을 반환 할 수 있다.
직렬화때는 주의 할 점이 있다.
// 정적 팩토리 메서드
public class Elvis() {
private static final Elvis INSTANCE = new Elvis();
// 생성하지 못하도록 막는다.
private Elvis() {}
// instance를 하나만 생성하도록 한다.
public static Elvis getInstance() {return INSTANCE;}
public void leaveTheBuilding() {}
}
정적 팩토리 메서드의 장점
- API를 바꾸지 않고도 싱글턴이 아니게 변경 할 수 있다.
- 제네릭 싱글턴 패턴으로 만들 수 있다.
- 정적 팩토리의 메서드 참조를 공급자로 사용 할 수 있다.
열거 타입 방식의 싱글턴
public enum Elvis {
INSTANCE;
public void leaveTheBuilding() { ... }
}
장점
- 간결하다
- 추가 노력 없이 직렬화 할 수 있다.
- 복잡한 상황이나 리플렉션 공격에서도 제2의 인스턴가 생기는 일을 완벽히 막아준다.
- 대부분 상황에서는 이 방법이 가장 좋다.
728x90
'Language > Effective java' 카테고리의 다른 글
모든 객체의 공통 메서드 (0) | 2022.06.06 |
---|---|
객체 생성과 파괴 (0) | 2022.06.05 |
객체 생성과 파괴 (0) | 2022.06.01 |
객체 생성과 파괴 (0) | 2022.06.01 |
객체 생성과 파괴 (0) | 2022.05.09 |
댓글