LoginSignup
1
4

More than 3 years have passed since last update.

JavaでEnum Strategy パターン

Last updated at Posted at 2019-05-19

オブジェクトを生成する際、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が発生
1
4
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
4