규칙 1. 생성자 대신 정적 팩터리 메서드를 사용하라
장점
생성자와 달리 정적팩터리 메서드의 경우, 이름을 정할 수 있음. (이해가 쉬움)
- 인자의 순서만 다른 생성자 두 개 존재 시, 이름이 동일하므로 API설명서를 읽지 않고는 이 두개를 구분하기 어려움. 정적 팩터리 메서드의 경우, 이름으로 의미를 표현 가능하므로 이런 문제가 발생하지 않음.
- (예시) 소수일 가능성이 높은 BigInteger객체를 생성하는 생성자인 BigInteger(int, int, Random) -> BigInteger.probablePrime 과 같은 이름의 정적 팩터리 메서드로 표현했다면 더 이해하기 쉬웠을 것.
생성자와 달리, 호출될 때 마다 새로운 객체를 생성하지 않아도 된다.
- 이미 만들어둔 객체 사용 / 객체 캐시(Cache) 해두고 재사용
- Boolean.valueOf(Boolean) 메서드 - flyWeight패턴과 유사
public static Boolean valueOf(Boolean b){ return b ? Boolean.TRUE : Boolean.FALSE; }
생성자와 달리 반환값 자료형의 하위자료형 객체를 반환 가능
- public 으로 선언되지 않은 클래스의 객체도 반환가능(유연성)
- java.util.EnumSet 의 경우, 모두 정적 팩터리 메소드만 존재. (enum 상수 개수에 따라 두 개 구현체 가운데 하나를 선택하여 반환)
- enum 상수 < 64개 : RegularEnumSet 반환
- enum 상수 > 64개 : JumboEnumSet 반환
단점
- public 이나 protected로 선언된 생성자가 없으므로, 하위클래스를 만들 수 없음.
- 정적 팩터리 메서드가 다른 정적 메서드와 확연히 구분되지 않음.
- 주석을 통해 해당 메서드가 정적 팩터리 메서드임을 알리거나
- 이름을 지을 때 주의하는 방법 뿐
- 보통 정적 팩토리 메서드 이름은 valueOf, of, getInstance, newInstance, getType, newType 의 단어로 표현함.
'공부 > JAVA' 카테고리의 다른 글
이펙티브자바 2장 규칙4. 객체생성을 막을 때는 private 생성자를 사용하라 (0) | 2021.02.17 |
---|---|
이펙티브 자바 2장 규칙3. private 생성자나 enum 자료형은 싱글턴 패턴 따르도록 설계하라 (0) | 2021.02.02 |
이펙티브 자바 2장 규칙2.생성자 인자가 많을 경우, Builder 패턴을 적용하라 (0) | 2021.02.02 |
[Spring] Interceptor (0) | 2020.08.08 |
[java] JAVA 맵(Map) (0) | 2016.11.04 |
댓글