📘 생성자 대신 정적 팩터리 메서드를 고려하라
public static Boolean valueOf(boolean b) { return b ? Boolean.TRUE : Boolean.FALSE; }정적팩터리메서드의 장점
이름을 가질 수 있음
: 정적 팩터리는 이름만 잘 지으면 반환될 객체의 특성을 쉽게 묘사할 수 있음
: 한 클래스에 시그니처가 같은 생성자가 여러 개 필요할 경우, 생성자를 정적 팩터리 메서드로 바꾸고 각각의 차이를 잘 드러내는 이름을 지어주는 것이 좋음호출될 때마다 인스턴스를 새로 생성하지 않아도 됨
:불필요한 객체 생성을 피할 수 있음반환 타입의 하위 타입 객체를 반환할 수 있는 능력이 있음
: 유연성이 높아짐입력 매개변수에 따라 매번 다른 클래스의 객체를 반환할 수 있음
정적 팩터리 메서드를 작성하는 시점에는 반환할 객체의 클래스가 존재하지 않아도 됨
정적팩터리메서드의 단점
상속 시 public protected 생성자가 필요하기 때문에 정적 팩터리 메서드만 제공할 경우 하위클래스를 만들 수 없음
프로그래머가 찾기 힘듦
정적 팩터리 메서드에 사용되는 명명 방식
from: 매개변수 하나를 받아서 해당 타입의 인스턴스를 반환of: 여러 매개변수를 받아 적합한 타입의 인스턴스 반환valueOf: from과 of의 더 자세한 버전getInstance: 매개변수로 명시한 인스턴스 반환newInstance: 호출마다 새로운 인스턴스 반환 보장getType: 생성할 클래스가 아닌 다른 클래스에서 팩터리 메서드를 정의할 때 사용, getInstance와 같음newType: 생성할 클래스가 아닌 다른 클래스에 팩터리 메서드를 정의할 때 사용, newInstance와 같음type: getType, newType의 간결한 버전
정적팩터리 메서드 public 생성자로 바꿔보기
- interface
public interface MakeBoolean { // interface말고 abstract class로 만들기 public Boolean valueOf(boolean b); }
- ConcreteMakeBoolean
public class ConcreteMakeBoolean implements MakeBoolean{ boolean b; public ConcreteMakeBoolean(boolean b) { this.b = b; } @Override public Boolean valueOf(boolean b) { return b ? Boolean.TRUE: Boolean.FALSE; } }장점
- 하위클래스를 만들 수 있음
- 프로그래머가 찾기 쉬움
단점
- 객체가 자주 요청되는 상황의 경우 호출 시마다 인스턴스를 새로 생성하기 때문에 성능이 떨어질 수 있음.
- 인스턴스 통제에 어려움이 생김
최종정리
정적 팩터리를 사용하는 게 유리한 경우가 더 많기 때문에 public 생성자를 제공하던 습관이 있다면 고치는 것이 좋다.