JavaでEnum Strategy パターン


オブジェクトを生成する際、if文やswitch文を使って条件分岐させるのではなく、enumを使うとコードがスッキリすることがあると思います。

以下、鳴き声を入力すると、それに対応する動物を返すEnumの実装例です。

AnimalCreator.java
public enum AnimalCreator {

    CAT("nyaa", Cat::new), 
    DOG("waon", Dog::new), 
    BIRD("pii", Bird::new);

    private String nakigoe;
    private Supplier<Animal> create;

    AnimalCreator(String nakigoe, Supplier<Animal> creator) {
        this.nakigoe = nakigoe;
        this.create = creator;
    }

    //鳴き声からAnimalを逆引きするMap
    private static final Map<String, AnimalCreator> map = 
            Stream.of(AnimalCreator.values())
                .collect(Collectors.toMap(a -> a.nakigoe, a -> a));
    //factory method
    public static Animal of(String nakigoe) {
        return Optional.ofNullable(map.get(nakigoe))
                .map(a -> a.create.get())
                .orElseThrow(IllegalArgumentException::new);
    }

}

呼び出し側はこのようになります。条件分岐がないので、コードがスッキリしました。

main.java
    Animal cat = AnimalCreator.of("nyaa");
    Animal dog = AnimalCreator.of("waon");
    Animal bird = AnimalCreator.of("pii");

    Animal mouse = AnimalCreator.of("chu");
    // java.lang.IllegalArgumentExceptionが発生