Java 带有工厂模式的枚举

Java 带有工厂模式的枚举,java,enums,Java,Enums,我有两种解决方案可以按枚举类型创建新实例 但是,这两种方法都有效,我应该选择哪一种?为什么 第1版: public enum ColorName { Red(ColorRed.class), Green(ColorGreen.class), Blue(ColorBlue.class), ColorName(Class<?> clazz) { this.clazz = clazz; } private final C

我有两种解决方案可以按枚举类型创建新实例

但是,这两种方法都有效,我应该选择哪一种?为什么

第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;
    }
}
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还有其他好处吗


还有更好的选择吗?可能通过使用
供应商

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);
    }
}
公共枚举颜色{
红色(文本->新红色(文本));
蓝色(文本->新蓝色(文本));
功能;
颜色(功能){
这个函数=函数;
}
颜色getColor(字符串文本){
返回函数。应用(文本);
}
}

我觉得这是实现目标的“最短”方法。

为什么在第一种方法中需要通过反射调用构造函数?为什么不让实例(在枚举构造函数中)或供应商返回这样的实例呢?您能提供一个
供应商
的解决方案吗?这会比使用版本1或2更好吗?如果不使用反射,就看不到版本1的解决方案。这是一个很好的解决方案,我想它甚至比版本2更好。顺便说一下,您甚至可以使用方法引用替换枚举:
RED(RedColor::new)
。只有在调用
RED.getColor(“test”)
之前,才创建
RedColor
的新实例。这很好。谢谢