Effective Java 2/E, 생성자 대신 정적 팩토리 메서드를 사용할 수 없는지 생각해 보라
13 Feb 2020 | programming effective java-
첫번째 장점은, 생성자와는 달리 정적 팩터리 메서드에는 이름이 있어서 클라이언트의 가독성이 높아진다.
-
두 번째로, 생성자와는 달리 호출할 때마다 새로운 객체를 생성할 필요는 없다. 캐싱해놓고 재사용하여 같은 객체가 불필요하게 거듭 생성되는것을 피할 수 있다.
- 세 번째로, 생성자와는 달리 반환값 자료형의 하위 자료형 객체를 반환할 수 있다.
- 팩터리 메서드가 인터페이스를 반환한다.
- 이 기법은 인터페이스 기반 프레임워크 구현에 적합하다. (예: Collection Framework)
- Java의 EnumSet도 확인해 보면, public으로 선언된 생성자가 없고 정적 팩터리 메서드뿐이다.
- 정적 팩터리 메서드가 반환하는 객체의 클래스는 정적 팩터리 메서드가 정의된 클래스의 코드가 작성되는 순간에 존재하지 않아도 괜찮다. (JDBC와 같은 서비스 제공자 프레임워크의 근간)
- 네 번째로, 형인자 자료형(parameterized type) 객체를 만들때 편하다.
- 클래스의 생성자를 호출할 때는, 형인자가 늘어나 복잡한 코드가 만들어 질 수 있지만 정적 팩터리 메서드를 사용해서 컴파일러가 형인자를 스스로 알아내도록 할 수 있다.
하지만, 정적 팩터리 메서드만 있는 클래스를 만들면 생기는 가장 큰 문제는, public이나 protected로 선언된 생성자가 없으므로 하위 클래스를 만들 수 없다는 것이다.
또한, 정적 팩터리 메서드가 다른 정적 메서드와 확연히 구분되지 않는다.
- 정적 팩터리 메서드의 흔한 이름
- valueOf
- of (=valueOf)
- getInstance
- getType (=getInstance of type)
- newType