공부기록

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

Programming/JAVA

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

코타쿠 2021. 12. 1. 18:48

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

정적 팩터리메서드는 그 클래스의 인스턴스를 반환하는 정적 메서드이다. 다음은 Boolean클래스에서 발췌한 간단한 예시이다. 이 메서드는 기본 타입인 boolean 값을 받아 Boolean 객체 참조로 반환한다.

public static void valueOf(boolean b){
    return b? Boolean.TURE : Boolean.FALSE;
}

이런 방식에는 장점 5가지가 있다.

  1. 이름을 가질 수 있다.

    생성자는 반환될 객체의 특징을 설명할 수 없지만, 정적 팩터리 메서드는 반환될 객체의 특징을 설명할 수 있다.

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

    위의 예시와 같이 인스턴스를 미리 만들어 재사용할 수 있다.

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

    반환될 객체의 클래스를 자유롭게 사용할 수 있는 '엄청난 유연성'이 주어진다.

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

    입력 변수에 따라 팩터리 메서드가 반환하는 객체는 다를 수 있다.

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

당장 존재하지 않아도, 일단 있어야 할 위치를 명시하고, 추후에 그 위치에 구현하면 된다. 그 예시는 아래와 같다.

package algorithm.dataStructure;

public abstract class StaticFactoryMethodType {

    public abstract void getName();

    public static StaticFactoryMethodType getNewInstance() {
        StaticFactoryMethodType temp = null;
        try {
            Class<?> childClass = Class.forName("algorithm.dataStructure.StaticFactoryMethodTypeChild");
            temp = (StaticFactoryMethodType) childClass.newInstance();

        }catch (ClassNotFoundException e) {
           System.out.println("클래스가 없습니다.");
        } catch (InstantiationException  e) {
            System.out.println("메모리에 올릴수 없습니다.");
        } catch (IllegalAccessException  e) {
            System.out.println("클래스파일 접근 오류입니다.");
        }

        return temp;
    }
}

정적 팩터리 메서드 작성으로 인한 단점은 아래와 같다.

  1. 상속이 불가능하다.

    상속을 위해서는 생성자가 private가 아니어야 하는데, 팩터리 매서드는 private으로 하기 때문에 상속이 불가능해진다.

  2. 프로그래머가 찾기 어렵다.

    정적 팩터리 메서드 이름은 API로 공개하지 않으면 따로 찾기 어려운 부분이 생성자를 사용할 때보다 크다.

출처

https://honbabzone.com/java/effective-java-static-factory-method/

'Programming > JAVA' 카테고리의 다른 글

ITEM 2 : 생성자에 매개변수가 많다면 빌더를 고려하라  (0) 2021.12.03
쓰레드(2)  (0) 2021.10.25
쓰레드(1)  (0) 2021.10.25
JVM  (0) 2021.05.29