본문 바로가기

Java/Java

(JAVA) 생성자 대신 정적 팩터리 메서드를 고려하라

정적 팩터리 메서드란?

특정 클래스의 인스턴스를 반환하는 단순한 정적 메서드

ex) 박싱클래스 Boolean

 

/*Boolean의 내부*/
 public static Boolean valueOf(String s) {
        return parseBoolean(s) ? TRUE : FALSE;
 }

 

정적 팩터리 메서드를 사용했을때의 장점들

1. 네이밍이 가능해진다.

생성자는 네이밍을 할 수가 없기 때문에 메서드만의 뚜렷한 특징을 나타낼 수 있는 방법이 없다.

하지만, 정적 팩터리 메서드는 메서드에 네이밍이 가능함으로 해당 메서드가 나타내는 의미를 바로 catch 할 수 있다.

* 시그니처가 같은 생성자를 여러번 호출이 필요하다면 정적 메서드 패턴을 사용하여 차이를 드러내는 이름을 지어주어 코드 가독성을 높여보자!

 

2. 호출 될 때마다 인스턴스를 새로 생성하지 않아도 된다.

객체 생성하는데 코스트가 큰 경우에는 정적 팩터리 메서드를 사용하여 객체가 여러번 생성되어 성능이 저하되는 것을 막아준다.

플라이 웨이트 패턴(FlyWeight-pattern) : 객체 생성 시 생성할 객체가 이미 만들어져있다면 생성하지 않고 없을때에만 생성

https://palpit.tistory.com/198

 

[Design Pattern] 플라이웨이트(Flyweight) 패턴 - 디자인 패턴

Pattern #12 플라이웨이트 패턴 본질적인 것과 부가적인 것을 구분하려 할 때 사용 패턴 요약 - 수많은 작은 객체를 생성하여야 할 때 - 사용되는 많은 객체의 생성 관리하는 객체를 따로 두어 이를 통해 필요한..

palpit.tistory.com

 

3. 반환 타입의 하위 타입 객체를 반환할 수 있는 능력이 있다.

반환타입을 하위 타입으로 지정할 수 있음으로써 코드의 유연성을 높여준다.

*자바8이후에는 Interface에도 static 메서드를 사용할 수 있게 된점을 참고하자!

public interface AfterJava8CouldStaticMethodImpl {

    static AfterJava8CouldStaticMethodImpl execute(int a, int b){

        return  new Child();
    }
}

 

4. 입력 매개변수에 따라 매번 다른 클래스의 객체를 반환 할 수 있다.

아래의 예시를 보면 RegularEnumSet과 JumboEnumSet은 EnumSet의 하위 클래스이다.

파라미터가 어떤것을 받느냐에 따라서 해당 객체가 어떤 하위 객체를 리턴할지가 결정된다.

반면, 사용자들은 해당클래스의 존재를 모르고 쓴다.(전혀 문제 되지 않음.)

public static <E extends Enum<E>> EnumSet<E> noneOf(Class<E> elementType) {
        Enum<?>[] universe = getUniverse(elementType);
        if (universe == null)
            throw new ClassCastException(elementType + " not an enum");

        if (universe.length <= 64)
            return new RegularEnumSet<>(elementType, universe);
        else
            return new JumboEnumSet<>(elementType, universe);
    }

 

5. 정적 팩터리 메서드를 작성하는 시점에는 반환한 객체의 클래가 존재하지 않아도 된다.


정적 팩터리 메서드를 사용했을때의 단점들

1. 상속을 하려면 public이나 protected 생성자가 필요하니 정적 팩터리 메서드만 제공하면 하위 클래스를 만들 수 없다.

 

2. 정적 팩터리 메서드는 프로그래머가 찾기 힘들다.

 


References

이펙티브 자바 Effective Java 3/E
국내도서
저자 : 조슈아 블로크(Joshua Bloch) / 이복연(개앞맵시)역
출판 : 인사이트 2018.11.01
상세보기