아이템 1. 생성자 대신 정적 팩토리 메서드를 고려하라.
클라이언트가 인스턴스를 얻는 수단으로는 public
생성자도 있지만, 정적 팩토리 메서드를 통해 제공할 수 있다.
그렇다면, 정적 팩토리 메서드를 사용했을 때의 장점은 무엇이 있을까? 🤔
정적 팩토리 메서드를 사용한다면?
- 이름을 가질 수 있다.
이는 가독성과 관련되었다고 생각한다. 예시로biginteger.probableprime
을 통해 소수인 정수를 리턴한다는 의미가 확 눈에 들어오는 것을 알 수 있다. - 호출될 때마다 인스턴스를 새로 생성하지 않아도 된다.
ex.Boolean.valueOf(boolean)
은 객체를 아예 생성하지 않는다.
반복되는 요청에 같은 객체를 반환하는 식으로 정적 팩토리 방식의 클래스는 언제, 어느 인스턴스를 살아있게 할 지 통제할 수 있다. 그렇다면, 인스턴스의 통제는 어떤 장점을 가질까?- 인스턴스 통제의 장점은? 인스턴스를 통제하면 클래스를 singleton or noninstantiable하게 만들 수 있다. 또한 불변값 클래스에서 동치인 인스턴스가 단 하나임을 보장할 수 있다.
여담이지만.. 불변, 일관성, 보장할 수 있음은 프로그래밍에서 매우 중요한 것 같다. 😶
- 반환 타입의 하위 타입 객체를 반환할 수 있는 능력이 있다.
반환할 객체의 클래스를 자유롭게 선택할 수 있는 유연성을 갖는데, 이 유연성을 활용하여 API 생성 시 구현 클래스를 공개하지 않고도 그 객체를 반환할 수 있어 API를 작게 유지할 수 있다. (API 외견을) - 입력 매개변수에 따라 매번 다른 클래스의 객체를 반환할 수 있다.
ex.enumSet
- 정적 팩터리 메서드를 작성하는 시점에는 반환할 객체의 클래스가 존재하지 않아도 된다.
이는 서비스 제공자 프레임워크를 만드는 근간이 된다.
How? 어떻게 서비스 제공자 프레임워크를 만드는 근간이 될까?
Client는 서비스 접근 API를 사용할 때 원하는 구현체의 조건을 명시할 수 있다. 조건을 명시하지 않으면 기본 구현체를 반환하거나 또는 조건이 명시되지 않았을 때 지원하는 구현체를 하나씩 돌아가면서 반환한다. 이것이 바로 유연한 정적 팩터리의 실체라고 볼 수 있다.