gpt4 book ai didi

java - 具有工厂模式的枚举

转载 作者:行者123 更新时间:2023-12-02 09:20:19 27 4
gpt4 key购买 nike

我有两种通过枚举类型创建新实例的解决方案。

两者都有效,但是我应该选择哪一个?为什么?

版本 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 更好(而且可能更快、类型安全、没有反射、不需要 try..catch)。

版本 1 的唯一好处:代码更小(每个枚举只有一个工厂方法,而不是一个构造函数)。

使用版本 1 代替版本 2 还有其他好处吗?

还有更好的选择吗?也许通过使用Supplier

最佳答案

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);
}
}

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

关于java - 具有工厂模式的枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58737599/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com