Closed okhee closed 2 years ago
클래스는 public 생성자 메소드 대신 static(정적) 팩토리 메서드를 제공할 수 있다.
new BigInteger(int, int, Random) BigInteger.probablePrime(int, Random)
public static Boolean valueOf(boolean b) { return (b ? TRUE : FALSE); }
java.util.Collections
EnumSet
RegularEnumSet
JumboEnumSet
JDBC
registerDriver
getConnection
Date.from(instant);
EnumSet.of(JACK, QUEEN, KING);
BigInteger.valueOf(Integer.MAX_VALUE);
StackWalker.getInstance(options);
Array.newInstasnce(classObject, arrayLen);
FileStore fs = Files.getFileStore(path);
BufferdReader br = Files.newBufferedReader(path);
Collections.list(someList);
Item 1. 생성자 대신 정적 팩터리 메서드를 고려하라
클래스는 public 생성자 메소드 대신 static(정적) 팩토리 메서드를 제공할 수 있다.
장점
이름을 가질 수 있다.
호출될 때마다 인스턴스를 새로 생성하지는 않아도 된다
하위 타입 객체의 인스턴스를 반환할 수 있다.
java.util.Collections
를 통해 제공하지만 내부적으로 45개의 구현클래스를 갖고 있고, 이를 공개하지 않기 때문에, API를 간단하게 유지할 수 있다.매개변수에 따라 다른 객체의 인스턴스를 반환할 수 있다.
EnumSet
(아이템 36)의 경우 정적 팩토리 메서드만 제공한다.RegularEnumSet
, 65개 이상일 경우JumboEnumSet
으로 만들서 사용하게 된다. (openjdk-source 일부링크)정적 팩토리 메서드를 작성하는 시점에는 해당 객체의 클래스가 존재하지 않아도 된다.
JDBC
가 좋은 예시registerDriver
를 통해 드라이버를 등록getConnection
으로 서비스를 얻음단점
상속을 하려면 public/protected 생성자가 필요해서, 정적 팩토리 메서드만 제공하면 하위 클래스를 만들 수 없다.
정적 팩터리 메서드는 프로그래머가 찾기 어렵다.
Date.from(instant);
EnumSet.of(JACK, QUEEN, KING);
BigInteger.valueOf(Integer.MAX_VALUE);
StackWalker.getInstance(options);
Array.newInstasnce(classObject, arrayLen);
FileStore fs = Files.getFileStore(path);
BufferdReader br = Files.newBufferedReader(path);
Collections.list(someList);
정리