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