본문 바로가기

programming/java

Item1. 생성자 대신 정적 팩터리 메서드를 고려하라.

정적 팩토리 메서드 장단점


장점

  1. 이름을 가질 수 있다.
    • 메서드의 이름으로 생성한 객체의 특성이나 역할을 코드 상에서 쉽게 유추할 수 있다. → 가독성 up
  2. 호출될 때마다 인스턴스를 새로 생성하지 않아도 된다.
    • Boolean 클래스에서 TRUE, FALSE 두가지 상태 인스턴스
    • 불변 클래스
    • 싱글턴 방식
    • 생성된 인스턴스를 재사용하는 것이 가능한 경우에는 불필요하게 인스턴스를 새로 생성하지 않고 정적 팩토리 메서드를 이용한 재사용 인스턴스를 이용하는 것이 좋다.
    • 플라이웨이트 패턴
  3. 반환 타입의 하위 타입 객체를 반환할 수 있는 능력이 있다.
    • 부모 클래스(혹은 인터페이스)를 구현한 자식 클래스가 있다면 자식 클래스를 반환타입으로 사용할 수 있다.
    • 인터페이스의 요소들만 알아도, 그 구현체들에 대한 이름조차 몰라도 인터페이스를 사용하는데 지장이 없다.
    • 인터페이스를 수정하지 않고 구현체를 수정할 수 있다. → 유연성 up
  4. 입력 매개 변수에 따라 매번 다른 클래스의 객체를 반환할 수 있다.
    • 부모(인터페이스)를 구현한 클래스가 여러개라면 매개 변수에 따라 다른 클래스의 객체를 반환할 수 있다.
    • EnumSet 클래스를 구현한 RegularEnumSet, JumboEnumSetSet의 크기에 따라 다른 객체가 반환된다.
  5. 정적 팩터리 메서드를 작성하는 시점에는 반환할 객체의 클래스가 존재하지 않아도 된다.
    • 구현체나 자식 클래스를 구현하지 않은 상태에서도 정적 펙터리 메서드를 작성하는데 오류가 없다

단점

  1. 상속을 하려면 public 이나 protected 생성자가 필요하니 정적 팩터리 메서드만 제공하면 하위 클래스를 만들 수 없다.
  2. 정적 팩터리 메서드는 프로그래머가 찾기 어렵다.

핵심 정리

정적 팩터리 메서드와 public 생성자는 각자 쓰임새가 있으니 상대적인 장단점을 이해하고 사용하는 것이 좋다. 그렇다고 하더라도 정적 팩터리를 사용하는게 유리한 경우가 더 많으므로 무작정 public 생성자를 제공하던 습관이 있다면 고치자

references

[생성자, 정적 팩터리 메서드 차이점](https://www.notion.so/ITEM-1-b60f9579f44f46d186f6eec33b48efbb) https://www.geeksforgeeks.org/difference-between-constructor-and-static-factory-method-in-java/#:~:text=Constructors can't have any,perform the initialization of objects.

https://it-mesung.tistory.com/184