Skip to content

Latest commit

 

History

History
86 lines (54 loc) · 2.65 KB

객체 생성과 파괴.md

File metadata and controls

86 lines (54 loc) · 2.65 KB

2장 객체 생성과 파괴

아이템1. 생성자 대신 정적 팩터리 메서드를 고려하라

클래스의 인스턴스를 반환하는 단순한 정적 메서드

장점 5가지

  1. 이름을 가질 수 있다
  2. 호출될 때마다 인스턴스를 새로 생성하지는 않아도 된다
  3. 반환 타입의 하위 타입 객체를 반환할 수 있는 능력이 있다
  4. 입력 매개변수에 따라 매번 다른 클래스의 객체를 반환할 수 있다
  5. 정적 팩터리 메서드를 작성하는 시점에는 반환할 객체의 클래스가 존재하지 않아도 된다

단점

  1. 상속을 하려면 public이나 protected 생성자가 필요하니 정적 팩터리 메서드만 제공하면 하위 클래스를 만들 수 없다.
  2. 정적 팩터리 메서드는 프로그래머가 찾기 어렵다.

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

점층적 생성자

자바빈즈패턴

안정성과 가독성을 겸비한 빌더패턴

아이템3. private 생성자나 열거 타입으로 싱글턴임을 보증하라

  1. public static final 필드 방식의 싱글턴

    public class Elvis{
    	public static final Elvis INSTANCE = new Elvis();
    	private Elvis() {}
    	public void leaveTheBuilding() {}
    }

    private 생성자는 초기화할때 딱 한번만 호출된다

    public or protected 생성자가 없으므로 Elvis 클래스가 초기화 될때 만들어진 인스턴스가 하나뿐임이 보장됨

    장점 : 해당 클래스가 싱글턴임이 API에 명백히 드러남

  2. 정적 팩터리 방식의 싱글턴

public class Elvis{
	private static final Elvsi INSTANCE = new Elvis();
	private Elvis() {}
	public static Elvis getInstance() {return INSTANCE;}
	
	public void leaveTheBuilding(){}
}

장점 : 추후에 API 변경 없이 싱글턴이 아니게 변경할 수 있다는 점

ex) 스레드 별로 다른 인스턴스 넘겨주기

  1. 열거 타입 방식의 싱글턴
public enum Elvis{
	INSTANCE;
	
	public void leaveTheBuilding(){}
}

인스턴스화를 막으려거든 private 생성자를 사용하라

추상 클래스로 만드는 것으로는 인스턴스화 막을 수 X → 하위에서 만들수 있기때문

private이므로 바깥에서 생성자에 접근할 수 없다

자원을 직접 명시하지 말고 의존 객체 주입을 사용하라

자원직접명시 하면 1가지 자원만 사용하게됨

자원이 상황따라 달라질 수 있으므로 인스턴스를 생성할때 생성자에 필요한 자원을 넘겨주도록

의존 객체 주입 사용

변형 : 생성자에 자원 팩터리를 넘겨주는 방식