정적 팩토리 메소드
2021-02-09
낙후된 환경에서 정적 팩토리 메소드를 of
로 명명하고 사용했더니, Sonar cube 가 메소드명으로 너무 짧은걸 쓰지말라며 major issue 로 잡았다.
주변 사람들이 이해를 못하는 와중에 나도 명쾌하게 설명할 수가 없어서, 이번 기회에 정리하기로 했다.
정적 팩토리 메소드, static factory method
객체를 캡슐화 하는 기법으로, 객체를 생성하는 메소드를 만들고, static 을 선언하는 방법이다.
흔히 볼 수 있는 String.valueOf()
메소드나 List.of(1, 2, 3)
을 생각하면 되겠다.
흔히 사용하는 네이밍 컨벤션은 다음과 같다.
valueOf
: argument 로 들어오는 값을 가지는 인스턴스를 생성할 경우of
: valueOf 의 줄인 형태getInstance
: argument 로 들어오는 값을 가질 수도 아닐수도있는 인스턴스를 생성할 경우, 싱글톤일 경우 argument 없고 매번 같은 객체 반환newInstance
: getInstance 와 비슷하지만, 매번 새로운 객체 생성getType
: getInstance 와 비슷하지만, 반환될 객체의 클래스와 다른 클래스에 팩토리 메소드가 있는 경우 (싱글톤 일 경우 참고)newType
: getType 과 비슷하지만 매번 새로운 객체 생성
이 패턴을 사용하면 뭐가 좋을까?
- 생성자와는 다르게 이름이 있으므로 가독성이 좋아진다.
- 호출할 떄마다 새로운 객체를 만들 필요가 없다.
Immutable 객체를 캐싱해 사용하는 경우를 말한다. public static BigDecimal[] cache = new BigDecimal[10]; 배열에 미리 객체를 세팅해두고, 이것을 상황에 맞게 반환하는 경우를 의미
- 하위 자료형 객체를 반환할 수 있다.
- parameterized type 객체를 만들때 편하다. -> jdk7 이후로는 의미가 없는 듯 하다.
List<String, List
> list = new ArrayList<String, List >(); 이렇게 쓰는걸 List<String, List > list = MyArrayList.newMyList(); 이렇게.. 하지만 이제는 타입추론을 지원하므로 List<String, List > list = new ArrayList<>(); 이렇게 쓰는쓰기 때문에 필요가 없어진 것 같다.
뭐가 나쁠까?
- 정적 팩토리 메소드만 있는 클래스라면, 하위 클래스를 만들 수 없다.
- 정적 팩토리 메소드는 다른 정적 메소드와 구별하기 힘들다.