Java/Effective Java
[Effective Java] 01.생성자 대신 정적 팩터리 메서드를 고려하라
통통푸딩
2022. 3. 4. 10:00
반응형
클래스의 인스턴스를 얻는 전통적인 수단은 public 생성자.
대신 정적팩터리 메서드를 제공하자.
장점
- 이름을 가질 수 있다. 생성자 자체만으로는 반환될 객체의 특성을 제대로 설명하지 못한다.
- 호출될 때마다 인스턴스를 새로 생성하지는 않아도 된다.
ex). Boolean.valueof(boolean) 메서드 - 반환 타입의 하위 타입 객체를 반환할 수 있는 능력
반환할 객체의 클래스를 자유롭게 선택할 유연성 제공 ( 구현 클래스를 공개하지 않고도 그 객체를 반환할 수 있다!). 예시로 자바 컬렉션 유틸리티 구현체 대부분이 단 하나의 인스턴스화 불가 클래스인java.util.Collections 에서 정적 팩터리 메서드를 통해 얻을 수 있다. - 입력 매개변수에 따라 매번 다른 클래스의 객체를 반환할 수 있다.(반환 타입의 하위 타입이기만 하면)
클라이언트는 팩터리가 건네주는 객체가 어느 클래스의 인스턴스인지 알 수도 없고 알 필요도 없다. - 정적 팩터리 메서드를 작성하는 시점에는 반환할 객체의 클래스가 존재하지 않아도 된다.
단점
- 상속을 하려면 public이나 proteced 생성자가 필요하니 정적 팩터리 메서드만 제공하면 하위 클래스를 만들 수 없다.
→ 상속보다 합성을 사용하도록 유도하여 오히려 장점일수도? 상속은 두 클래스의 결합도를 높이기에 합성을 사용하는 것이 더 좋다. - 정적 팩터리 메서드는 프로그래머가 찾기 어렵다. 메서드 명명을 잘 지어야한다.
결론
장단점을 잘 고려하여 때에 맞춰 사용하자.
그래도 정적 팩터리를 사용하는게 더 유리한 경우가 많으므로 습관을 들이자.
반응형