我有两种解决方案,可以通过枚举类型创建新实例。
两者都能工作,但是我应该选择哪一个?为什么?
版本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
?
答案 0 :(得分:1)
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);
}
}
我觉得这是实现目标的“最短”方法。