클래스의 인스턴스를 얻는 전통적인 수단은 public 생성자다.
생성자와 별도로 정적 팩터리 메서드(static factory method)를 제공할 수 있다.
public static Boolean valueOf(boolean b) {
return b ? Boolean.TRUE : Boolean.FALSE;
}
한 클래스에 시그니처가 같은 생성자가 여러 개 필요할 것 같으면, 생성자를 정적 팩터리 메서드로 바꾸고 각각의 차이를 잘 드러내는 이름을 지어주자.
불변 클래스는 인스턴스를 미리 만들어 놓거나 새로 생성한 인스턴스를 캐싱하여 재활용하는 식으로 불필요한 객체 생성을 피할 수 있다.
1,2번은 굉장히 와닿지만, 아직 3,4,5번은 경험이 없어서 그런지 와닿지가 않는다.
유틸리티 구현 클래스들은 상속할 수 없다.
인스턴스화할 방법을 따라야 한다. 그래서 정적 팩터리 메서드에 흔히 사용하는 명명방식을 이용하는 것이 좋다.
메서드명 | 메서드 기능 |
---|---|
from | 매개변수를 하나 받아서 해당 타입의 인스턴스를 반환 |
of | 여러 매개변수를 받아 적합한 타입의 인스턴스를 반환하는 집계 메서드 |
valueOf | from 과 of 의 더 자세한 버전 |
instance or getInstance | 매개변수가 있다면, 명시한 인스턴스를 반환 |
create or newInstance | getInstance 와 같지만 매번 새로운 인스턴스를 생성해 반환한다. |
getType | getInstance와 같으나, 생성할 클래스가 아닌 다른 클래스에 팩터리 메서드를 정의할 때 사용 |
newType | newInstance와 같으나, 생성할 클래스가 아닌 다른 클래스에 팩터리 메서드를 정의할 때 사용 |
type | getType 과 newType의 간결한 버전 |
블랙잭 미션을 할 때 카드를 캐싱했는데, valueOf
메서드를 이용해서 정적 팩토리 메서드를 사용해서 활용해봤다.