Item1
Item 생성자 대신 정적 팩토리 메소드를 고려하라
1 개요
- 클라이언트가 클래스의 인스턴스를 얻는 수단은 다음과 같이 두 가지로 나눌 수 있다.
- 일반적인 public생성자에 비해 정적 팩터리 메서드는 다양한 장점을 가지고 있다.
public 생성자
public Book(){}
정적 팩터리 메서드
public static Book createBook(){
return instance();
}
2 정적 팩터리 메서드의 장점
2.1 이름을 가질 수 있다
- 정적 팩터리 메소드는 '메소드'이기 때문에 이름을 가질 수 있다.
- 그 이름을 통해 해당 정적 메서드가 어떤 특징을 갖는지,
어떤 인스턴스를 반환하는지 명시적으로 표현
할 수 있다. - 한 클래스에 시그니처가 같은 생성자가 여러 개 필요한 경우 생성자를 정적 팩토리 메소드로 바꾸고 각각의 차이를 잘 드러내는 이름을 지어주자
생성자의 단점
- 하나의 시그니처로는 생성자를 하나만 만들 수 있다.
- 입력 매개변수들의 순서를 다르게해 시그니처를 변경하여 이 제한을 피할 수 있지만 좋은 발상이 아니다
- 코드를 읽는 사람도 클래스 설명 문서를 찾아보지 않고는 의미를 모르기 때문입니다.
2.2 인스턴스 캐싱과 통제
- 생성자는 항상 새로운 인스턴스를 만들기 때문에 인스턴스를 통제할 수 없다.
- 정적 팩터리 메서드를 통해 인스턴스 캐싱과 인스턴스 통제를 활용할 수 있다.
인스턴스 캐싱
- 인스턴스를 미리 생성해 놓고, 필요할 때마다 이를 가져다 쓰는 방식을 뜻한다.
- 불필요한 객체 생성을 피하고, 객체 생성의 비용을 줄여 준다.
- 아래 Boolean 클래스는 인스턴스를 미리 생성해 두고 정적 팩토리 메소드를 통해 이를 가져다 쓰는 방식
public final class Boolean implements java.io.Serializable, Comparable<Boolean> {
public static final Boolean TRUE = new Boolean(true);
public static final Boolean FALSE = new Boolean(false);
public static Boolean valueOf(boolean b) {
return (b ? TRUE : FALSE);
}
...
}