У меня есть два решения для создания нового экземпляра по типу 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
?