在Java中使用工厂枚举是最佳实践吗?
Java允许我们在Enum上嵌入数据和行为。 我不想直接在枚举上实现工厂,因为我认为这不是它的角色 但我可以将类引用放在枚举上,并在外部工厂上构造对象。与传统的工厂模式相比,什么是最适合您的实现?在哪种情况下使用哪种解决方案更好 现在,代码 函数用于两种解决方案中构造对象。如果需要,可使用地图实现飞行重量模式在Java中使用工厂枚举是最佳实践吗?,java,enums,factory,Java,Enums,Factory,Java允许我们在Enum上嵌入数据和行为。 我不想直接在枚举上实现工厂,因为我认为这不是它的角色 但我可以将类引用放在枚举上,并在外部工厂上构造对象。与传统的工厂模式相比,什么是最适合您的实现?在哪种情况下使用哪种解决方案更好 现在,代码 函数用于两种解决方案中构造对象。如果需要,可使用地图实现飞行重量模式 private Action getAction(Class<? extends Action> actionClazz) { // logger + error ha
private Action getAction(Class<? extends Action> actionClazz) {
// logger + error handling
return actionClazz.newInstance();
}
2) 使用枚举样式的工厂:
public enum ActionEnum {
LOAD_DATA(ActionLoadConfig.class),
LOAD_CONFIG(ActionLoadData.class);
public ActionEnum(Class<? extends Action> clazz){...}
public Class<? extends Action> getClazz() {return this.clazz}
}
public Action getAction(ActionEnum action) {
return getAction(action.getClazz());
}
公共枚举操作枚举{
加载_数据(ActionLoadConfig.class),
LOAD_CONFIG(ActionLoadData.class);
public ActionEnum(Class第二个要干净得多:它不需要任何长的开关块,并且与第一个一样,没有忘记其中一个枚举值的风险
但是,并不总是可以使用它,因为枚举可能是一些不应该与操作工厂耦合的通用枚举(月)
static final EnumMap<ActionEnum, Class<? extends Action>> enumToClass = new EnumMap<>();
static
{
enumToClass.put(ActionEnum.LOAD_DATA, ActionLoadData.class);
etc...
}
public Action getAction(ActionEnum action)
{
return getAction(enumToClass.get(action));
}
static final EnumMap这适合我:
enum ActionEnum
{
LOAD_DATA {
@Override
public ActionLoadData getInstance() {
return new ActionLoadData ();
}
},
LOAD_CONFIG {
@Override
public ActionLoadConfig getInstance() {
return new ActionLoadConfig();
}
};
public abstract ILightBulb getInstance();
}
class ActionFactory
{
public Action getAction(ActionEnum action)
{
return action.getInstance();
}
}
如果可能的话,应该避免调用newInstance()
,因为它公然破坏了java提供的一些编译时保护(阅读其javadoc),并引入了新的异常来处理
这是一个类似于的解决方案,由于函数接口和方法引用,它更加简洁
public enum ActionEnum {
LOAD_DATA(ActionLoadData::new),
LOAD_CONFIG(ActionLoadConfig::new)
private Supplier<Action> instantiator;
public Action getInstance() {
return instantiator.get();
}
ActionEnum(Supplier<Action> instantiator) {
this.instantiator = instantiator;
}
}
public Action getAction(ActionEnum action) {
return action.getInstance();
}
公共枚举操作枚举{
加载数据(ActionLoadData::new),
加载配置(ActionLoadConfig::新建)
私人供应商实例化器;
公共操作getInstance(){
返回实例化器.get();
}
ActionEnum(供应商实例化器){
this.instantior=实例化器;
}
}
公共操作getAction(ActionEnum操作){
返回action.getInstance();
}
你能给我一个主函数中第二个的例子吗?(我想看看这个工厂的使用情况),这个问题是4年前提出的,仍然是最好的方法吗?这是一个非常优雅的解决方案。非常感谢!这是一个非常优雅的解决方案。非常感谢!
public enum ActionEnum {
LOAD_DATA(ActionLoadData::new),
LOAD_CONFIG(ActionLoadConfig::new)
private Supplier<Action> instantiator;
public Action getInstance() {
return instantiator.get();
}
ActionEnum(Supplier<Action> instantiator) {
this.instantiator = instantiator;
}
}
public Action getAction(ActionEnum action) {
return action.getInstance();
}