enum с фабричным рисунком - PullRequest
       9

enum с фабричным рисунком

0 голосов
/ 06 ноября 2019

У меня есть два решения для создания нового экземпляра по типу enum.

Обе работы, однако, какой из них выбрать и почему?

версия 1:

public enum ColorName {
    Red(ColorRed.class),
    Green(ColorGreen.class),
    Blue(ColorBlue.class),


    ColorName(Class<?> clazz) {
        this.clazz = clazz;
    }

    private final Class<?> clazz;

    public Class<?> getClazz() {
        return clazz;
    }

    public Color createColor(String name) {

        Color c = null;

        try {
            c = (Color) this.clazz.getConstructor(String.class).newInstance(name);
        } catch (Exception e) {
            e.printStackTrace();
        }

        return c;
    }
}

версия 2:

public enum ColorName {
    Red{
        @Override
        public Color newInstance(String name) {
            return new ColorRed(name);
        }
    },
    Green{
        @Override
        public Color newInstance(String name) {
            return new ColorGreen(name);
        }
    },
    Blue{
        @Override
        public Color newInstance(String name) {
            return new ColorBlue(name);
        }
    };

    public abstract Color createColor(String name);
}

На мой взгляд, версия 2 лучше (и, вероятно, быстрее, печатать безопасно, без отражений, не нужно пытаться поймать).

Единственное преимущество в версии 1 : меньший код (только один метод фабрики вместо одного конструктора для каждого перечисления).

Существуют ли другие преимущества использования версии 1 вместо версии 2 ?

Существуют ли лучшие альтернативы? Может быть, используя Supplier?

1 Ответ

1 голос
/ 07 ноября 2019

Функциональный подход Java 8:

public enum Color {

    RED(text -> new RedColor(text));
    BLUE(text -> new BlueColor(text));

    Function<String, Color> function;

    Color(Function function) {
        this.function = function;
    }

    Color getColor(String text) {
        return function.apply(text);
    }
}

Мне кажется, что это самый короткий способ достижения вашей цели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...