인스턴스 생성자의 이름을 붙여줄 수 있다.
파라미터만 있는 기본 생성자보다 의도를 정확하게 파악할 수 있다.
// 값이 소수인 BigInteger 를 반환하는 정적 팩터리 메서드
BigInteger.probablePrime();
동일한 시그니처의 생성자가 여러개 필요한 경우 이름으로 구분할 수 있다.
호출될 때마다 인스턴스를 새로 생성하지는 않아도 된다.
인스턴스를 캐싱하여 생성 비용을 줄일 수 있다.
기본 생성자의 경우 호출하면 기본으로 새 인스턴스를 생성하나, 정적 팩터리 메서드는 메서드이기 때문에 미리 생성한 인스턴스를 재활용할 수 있다.
// 내부에 Boolean.TRUE, Boolean.FALSE 객체 포함하고 있음
Boolean.valueof(boolean)
하위 타입의 객체를 반환할 수 있다.
입력 매개변수에 따라 매번 다른 클래스의 객체를 반환할 수 있다.
정적 팩터리 메서드 내부에서 특정 기준에 따라 다른 타입의 객체를 반환할 수 있다.
이를 사용하는 입장에서는 추상화된 타입으로 받기 때문에 반환 타입이 달라도 가능하다.
// EnumSet
// enum 요소가 64개 이하인 경우 RegularEnumSet, 초과인 경우 JumboEnumSet
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);
}
정적 팩터리 메서드를 작성하는 시점에는 반환될 객체의 클래스가 존재하지 않아도 된다.
from: 매개변수 하나, 해당 타입의 인스턴스 반환
Date date = Date.from(instance);
of: 여러 매개변수, 적합한 타입의 인스턴스 반환
Set<Rank> faceCards = EnumSet.of(JACK, QUEEN, KING);
valueOf: from 과 of 의 더 자세한 버전
BigInteger prime = BigInteger.valueOf(Integer.MAX_VALUE);
instance 혹은 getInstance: 인스턴스 반환
StackWalker luke = StackWalker.getInstance(options);
create 혹은 newInstance: 무조건 새로운 인스턴스 반환
Object newArray = Array.newInstance(classObject, arrayLen);
getType: 다른 클래스 반환 시 타입 명시
FileStore fs = Files.getFileStore(path);
newType: 다른 클래스 반환 시 타입 명시, 무조건 새로운 인스턴스 반환
BufferedReader br = Files.newBufferedReader(path);
type: getType 과 newType 의 간결한 버전
List<Complaint> litany = Collections.list(legacyLitany);