static method)를 사용한다.📢디자인 패턴의 팩토리 메서드와는 다른 것이며, 디자인 패턴 중에는 정적 팩토리 메서드와 일치하는 것은 존재하지 않는다.
// 생성자 방식
public class Flower {
String name;
String floriography;
int price;
// 'Flower(String, int)' is already defined
public Flower(String floriography, int price) {
this.floriography = floriography;
this.price = price;
}
// 'Flower(String, int)' is already defined
public Flower(String name, int price) {
this.name = name;
this.price = price;
}
}
// 정적 팩토리 메서드
public class Flower {
String name;
String floriography;
int price;
public static Flower CreateFromFloriography(String floriography, int price) {
Flower flower = new Flower();
flower.floriography = floriography;
flower.price = price;
return flower;
}
public static Flower CreateFromName(String name, int price) {
Flower flower = new Flower();
flower.name = name;
flower.price = price;
return flower;
}
}
new 생성자()를 사용해야 하는데, 이때마다 인스턴스를 새로 생성한다.public final class Boolean implements java.io.Serializable, Comparable<Boolean> {
public static final Boolean TRUE = new Boolean(true);
public static final Boolean FALSE = new Boolean(false);
public static Boolean valueOf(boolean b) {
return (b ? TRUE : FALSE);
}
// 생략
}
Boolean 클래스에서 true와 false 값은 자주 사용되므로 TRUE, FALSE 인스턴스를 먼저 생성해 놓는다. valueOf() 메서드를 사용할 때마다 기존에 생성해 두었던 인스턴스인 TRUE 또는 FALSE를 반환해 준다.public class Grade {
...
private static Grade of(int takenSemester) {
if (0 < takenSemester && takenSemester <= 2) {
return new Freshman();
}
if (2 < takenSemester && takenSemester <= 4) {
return new Sophomore();
}
if (4 < takenSemester && takenSemester <= 6) {
return new Junior();
}
if (6 < takenSemester &&<takenSemester <= 8){
return new Senior();
}
...
}
...
}
// EnumSet.noneOf()
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.noneOf() 메서드는 파라미터로 부터 받은 값의 길이에 따라 RegularEnumSet<>이나 JumboEnumSet<>을 반환 한다.private으로 해야 한다.public이나 protected가 붙은 생성자가 있어야 하는데, 그러한 생성자가 없으므로 정적 팩토리 메서드만을 제공하는 클래스는 상속을 하지 못한다.-JavaDoc에선 @See-를 사용하여 나타낼 수 있다- 또는 문서화를 통해 설명을 달아놓는 게 좋다. from : 매개변수를 하나 받아서 해당 타입의 인스턴스를 반환하는 형변환 메서드
Date d = Date.from(instant);
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 : instance 혹은 getInstance와 같지만, 매번 새로운 인스턴스를 생성해 반환함을 보장한다.
Object newArray = Array.newInstance(classObject, arrayLen);
getType : getInstance와 같으나, 생성할 클래스가 아닌 다른 클래스에 팩토리 메서드를 정의할 때 쓴다. Type은 팩토리 메서드가 반환할 객체의 타입이다.
FileStore fs = Files.getFileStore(path);
newType : newInstance와 같으나, 생성할 클래스가 아닌 다른 클래스에 팩토리 메서드를 정의할 때 쓴다. Type은 팩토리 메서드가 반환할 객체의 타입이다.
BufferedReader br = Files.newBufferedReader(path);
type : getType과 newType의 간결한 버전
List<Complaint> litany = Collections.list(legacyLitany);
정적 팩토리 메서드 (Static factory method) [Effective Java]
정적 팩토리 메서드(Static Factory Method)