Effective Java 2/E, 생성자 대신 정적 팩토리 메서드를 사용할 수 없는지 생각해 보라

|
  • 첫번째 장점은, 생성자와는 달리 정적 팩터리 메서드에는 이름이 있어서 클라이언트의 가독성이 높아진다.

  • 두 번째로, 생성자와는 달리 호출할 때마다 새로운 객체를 생성할 필요는 없다. 캐싱해놓고 재사용하여 같은 객체가 불필요하게 거듭 생성되는것을 피할 수 있다.

  • 세 번째로, 생성자와는 달리 반환값 자료형의 하위 자료형 객체를 반환할 수 있다.
    • 팩터리 메서드가 인터페이스를 반환한다.
    • 이 기법은 인터페이스 기반 프레임워크 구현에 적합하다. (예: Collection Framework)
    • Java의 EnumSet도 확인해 보면, public으로 선언된 생성자가 없고 정적 팩터리 메서드뿐이다.
    • 정적 팩터리 메서드가 반환하는 객체의 클래스는 정적 팩터리 메서드가 정의된 클래스의 코드가 작성되는 순간에 존재하지 않아도 괜찮다. (JDBC와 같은 서비스 제공자 프레임워크의 근간)
  • 네 번째로, 형인자 자료형(parameterized type) 객체를 만들때 편하다.
    • 클래스의 생성자를 호출할 때는, 형인자가 늘어나 복잡한 코드가 만들어 질 수 있지만 정적 팩터리 메서드를 사용해서 컴파일러가 형인자를 스스로 알아내도록 할 수 있다.
하지만, 정적 팩터리 메서드만 있는 클래스를 만들면 생기는 가장 큰 문제는, public이나 protected로 선언된 생성자가 없으므로 하위 클래스를 만들 수 없다는 것이다.

또한, 정적 팩터리 메서드가 다른 정적 메서드와 확연히 구분되지 않는다.
  • 정적 팩터리 메서드의 흔한 이름
    • valueOf
    • of (=valueOf)
    • getInstance
    • getType (=getInstance of type)
    • newType