장점
이름을 가질 수 있다. (동일한 시그니처의 생성자를 두개 가질 수 없다.)호출될 때마다 인스턴트를 새로 생성하지 않아도 된다. (Boolean.valueOf)
/**
* 이 클래스의 인스턴스는 #getInstance()를 통해 사용한다.
* @see #getInstance()
*/
// 플라이 웨이트 패턴 - getInstance(), instance 를 통제하는 방법
// 정적 팩토리 메서드를 제공하지만 private 기본 생성자를 가짐
public class Settings {
private boolean useAutoSteering;
private boolean useABS;
private Difficulty difficulty;
private Settings() {}
private static final Settings SETTINGS = new Settings();
public static Settings getInstance() {
return SETTINGS;
}
}
반환 타입의 하위 타입 객체를 반환할 수 있는 능력이 있다. (인터페이스 기반 프레임워크, 인터페이스에 정적 메소드)
입력 매개변수가 따라 매번 다른 클래스의 객체를 반환할 수 있다. (EnumSet)
정적 팩터리 메서드를 작성하는 시점에는 반환할 객체의 클래스가 존재하지 않아도 된다. (서비스 제공자 프레임워크)
// 인터페이스 함수의 구현체가 없어도 된다.
public interface HelloService {
(public) String hello();
}
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
ServiceLoader<HelloService> loader = ServiceLoader.load(HelloService.class);
Optional<HelloService> helloServiceOptional = loader.findFirst();
helloServiceOptional.ifPresent(h -> {
System.out.println(h.hello());
});
단점
of, valueOf, name Pattern 을 사용하자.
가장 좋은 방법은 문서화를 진행하자.
/**
* 이 클래스의 인스턴스는 #getInstance()를 통해 사용한다.
* @see #getInstance()
*/
===
mvn javadoc:javadoc
-> target - site - index.html
상수 목록을 담을 수 있는 데이터 타입.
public enum OrderStatus {
PREPARING(0), SHIPPED(1), DELIVERING(2), DELIVERED(3);
private int number;
OrderStatus(int number) {
this.number = number;
}
}
특정한 변수가 가질 수 있는 값을 제한할 수 있다. 타입-세이프티 (Type-Safety)를 보장할 수 있다.
싱글톤 패턴을 구현할 때 사용하기도 한다.
1. 특정 enum 타입이 가질 수 있는 모든 값을 순회하며 출력하라
Arrays.stream(OrderStatus.values()).forEach(System.out::println);
2. enum은 자바의 클래스처럼 생성자, 메소드, 필드를 가질 수 있는가?
public static void main(String[] args) {
Order order = new Order();
// equals 메서드로 인한 NullPointerException의 에러 발생을 제외
if (order.orderStatus == OrderStatus.DELIVERED) {
System.out.println("delivered");
}
Arrays.stream(OrderStatus.values()).forEach(System.out::println);
}
3. enum의 값은 == 연산자로 동일성을 비교할 수 있는가?
4. enum을 key로 사용하는 Map을 정의하세요. 또는 enum을 담고 있는 Set을 만들어
보세요 -> EnumSet, EnumMap 을 쓰는 것이 성능에 훨씬 유리하다.
객체를 가볍게 만들어 메모리 사용을 줄이는 패턴 → 객체를 재사용하는 패턴