Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中使用工厂枚举是最佳实践吗?_Java_Enums_Factory - Fatal编程技术网

在Java中使用工厂枚举是最佳实践吗?

在Java中使用工厂枚举是最佳实践吗?,java,enums,factory,Java,Enums,Factory,Java允许我们在Enum上嵌入数据和行为。 我不想直接在枚举上实现工厂,因为我认为这不是它的角色 但我可以将类引用放在枚举上,并在外部工厂上构造对象。与传统的工厂模式相比,什么是最适合您的实现?在哪种情况下使用哪种解决方案更好 现在,代码 函数用于两种解决方案中构造对象。如果需要,可使用地图实现飞行重量模式 private Action getAction(Class<? extends Action> actionClazz) { // logger + error ha

Java允许我们在Enum上嵌入数据和行为。 我不想直接在枚举上实现工厂,因为我认为这不是它的角色

但我可以将类引用放在枚举上,并在外部工厂上构造对象。与传统的工厂模式相比,什么是最适合您的实现?在哪种情况下使用哪种解决方案更好

现在,代码

函数用于两种解决方案中构造对象。如果需要,可使用地图实现飞行重量模式

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