본문 바로가기
Language/Effective java

객체 생성과 파괴

by y.j 2022. 5. 22.
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() {}
}

장점

  1. 싱글턴임을 바로 알 수 있다.
  2. 간결하다.

 

정적 팩토리 메서드

private 생성자로 생성자를 사용하지 않는다는 것을 명시 할 수 있으며, static 메서드를 통해 한 개의 객체만을 반환 할 수 있다.

직렬화때는 주의 할 점이 있다.

// 정적 팩토리 메서드
public class Elvis() {

    private static final Elvis INSTANCE = new Elvis();

    // 생성하지 못하도록 막는다.
    private Elvis() {}

    // instance를 하나만 생성하도록 한다.
    public static Elvis getInstance() {return INSTANCE;}

    public void leaveTheBuilding() {}
}

정적 팩토리 메서드의 장점

  1. API를 바꾸지 않고도 싱글턴이 아니게 변경 할 수 있다.
  2. 제네릭 싱글턴 패턴으로 만들 수 있다.
  3. 정적 팩토리의 메서드 참조를 공급자로 사용 할 수 있다.

 

열거 타입 방식의 싱글턴

public enum Elvis {
    INSTANCE;

    public void leaveTheBuilding() { ... }
}

장점

  1. 간결하다
  2. 추가 노력 없이 직렬화 할 수 있다.
  3. 복잡한 상황이나 리플렉션 공격에서도 제2의 인스턴가 생기는 일을 완벽히 막아준다.
  4. 대부분 상황에서는 이 방법이 가장 좋다.
728x90

'Language > Effective java' 카테고리의 다른 글

모든 객체의 공통 메서드  (0) 2022.06.06
객체 생성과 파괴  (0) 2022.06.05
객체 생성과 파괴  (0) 2022.06.01
객체 생성과 파괴  (0) 2022.06.01
객체 생성과 파괴  (0) 2022.05.09

댓글