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

신명철·2022년 2월 9일
0

Effective Java

목록 보기
1/80

정적 팩터리 메서드

클래스의 인스턴스를 얻는 전통적인 수단은 public 생성자 이다.
정적 팩터리 메서드를 이용한 인스턴스 생성 방식은 다음과 같은 장점이 있다.

1. 이름을 가질 수 있다

  • BigInteger(int, int, Random)BigInteger.probablePrime 중 어떤 것이 소수를 반환한다는 의미를 더 잘 나타내는지를 생각해보자.

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

  • 생성자는 반드시 객체를 리턴해야 하지만 정적 팩터리 메서드는 그렇지 않다.
  • 캐싱을 할 수도, 상수를 반환할 수도, 미리 만들어 놓은 객체를 반환할 수도 있다.

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

class B extends A{
}

class A {
	public static getInstance(){
    	return new B();
    }
}
  • A의 하위 타입인 B를 반환하고 있다.

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

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);
}
  • Enumset 의 실제 코드로, RegularEnumset 과 JumboEnumset 은 EnumSet 를 상속받고 있다.
  • elementType의 universe 를 기준에 따라서 서로 다른 객체로 반환하고 있다.
  • 3번(반환 타입의 하위 타입 객체 반환할 수 있다) 의 연장선 같은 느낌이다.
  • 즉, 반환 타입의 하위 타입이면 뭐든지 반환할 수 있다.

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

public class A {

	public static List<interfaceA> getInterfaceA(){
		return new ArrayList<>();
	}
}
  • 인터페이스나 클래스가 만들어지는 시점에 하위 타입의 클래스가 존재하지 않아도 나중에 만들어질 클래스가 인터페이스나 클래스를 상속받으면 의존성을 주입받아서 언제든지 사용이 가능하다.
profile
내 머릿속 지우개

0개의 댓글