java - 将 Enum 或 String 用于静态工厂方法?

标签 java enums design-patterns factory static-factory

static 工厂方法中使用 enumString 分配到正确的对象以创建更好吗?

String 示例:

public static Car createCar(String carName){
    if(carName.equals("Ferrari")){
        return new Ferrari();
    }
    else if(carName.equals("Porsche")){
        return new Porsche();
    }
    ....
}

enum 示例:

public static Car createCar(CarEnum carEnum){
    if(CarEnum.FERRARI.equals(carEnum)){
        return new Ferrari();
    }
    else if(CarEnum.PORSCHE.equals(carEnum)){
        return new Porsche();
    }
    ....
}

目前,据我所知:

使用 enum 的好处:

  • 避免用户使用未处理的 carName 调用工厂。

使用 Enum 的缺点:

增加依赖性,因为对 enum 的更改(例如,FERRARI 变为 ENZO_FERRARI)将需要在客户端进行修改。但是,使用 String 我们可以将 Ferrari 重定向到 Enzo Ferrari 实例,而无需重新编译客户端代码。当然,我们可以为使用旧 enum 值的客户端做同样的事情,并将 FERRARI 重定向到 ENZO-FERRARI enum 但对我而言,这意味着 enum 必须保留旧值以使客户端兼容...对我来说没有意义。

我想知道你对这个问题有什么看法?

最佳答案

如果像您在这种情况下所做的那样,您有固定数量的方法可接受的参数,那么最好在方法的客户端上尽可能地强制执行该约束。在这种情况下,接受任何旧字符串会比使用枚举导致更多的失败。

但是,在像这样的有限情况下,您也可以考虑为每种类型的汽车使用命名工厂方法:如 createFerrari()、createPorsche() 等。

关于java - 将 Enum 或 String 用于静态工厂方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7703061/

相关文章:

java - 如何将 json 节点中的动态键映射到类?

java - 查找两点之间的角度时出错

java - 如何在jsp中传递逗号分隔的列表?

java - 告诉枚举要使用什么子类类型

c++ - 枚举类与枚举或类有何相似之处?

java - 我应该为我的单例类创建 protected 构造函数吗?

Java:打印数组元素

design-patterns - 设计模式和 Scala

java - 是否建议使用静态变量来维护状态?

delphi - 在 Delphi 中迭代枚举中的项目