使用enum
或String
调度到正确的对象以在static
工厂方法中创建是否更好?
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
必须保持旧的价值观以使客户兼容......对我来说没有意义。
我想知道您对此主题有何看法?
答案 0 :(得分:3)
都不是。使用Enum并使该方法成为Enum本身的实例方法。不,如果需要的话。
答案 1 :(得分:3)
如果像在这种情况下那样,对方法有一定数量的可接受参数,那么最好在方法的客户端上尽可能地强制执行该约束。在这种情况下,接受任何旧字符串会导致比使用枚举更多的失败。
但是,在这种情况有限的情况下,您可能还会考虑为每种类型的汽车使用命名工厂方法:如createFerrari(),createPorsche()等。
答案 2 :(得分:1)
我会使用Enums
;我不喜欢在这种情况下使用的字符串。枚举的优点是你可以切换它们(这不适用于字符串),你不需要处理错误的输入。
答案 3 :(得分:0)
enum
的另一个好处是,它允许您使用switch/case
语法而不是无限if/else
。
答案 4 :(得分:0)
我不会在枚举中添加实例方法。今天我们在枚举中使用静态块并引用枚举时看到了奇怪的意外行为。突然一个枚举实例是空的!!! ??? 我会使用抽象的工厂模式。这样你可以在两个枚举实例中使用相同的工厂 我还会使用hashmap来存储工厂。这样你就没有这种情况,或者是否会增加循环复杂性。