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

Mik*_*378 5 java enums design-patterns factory static-factory

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

示例String

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

示例enum

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

目前,据我所知:

使用的好处enum

  • 避免用户使用未经处理的carName.

使用的缺点Enum

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

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

Gar*_*ryF 4

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

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