[英]Use Enum or String for a static factory method?
使用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
必须保留旧值以使客户端兼容......对我来说没有意义。
我想知道你对这个问题有什么看法?
如果像在这种情况下那样,对方法有一定数量的可接受参数,那么最好在方法的客户端上尽可能地强制执行该约束。 在这种情况下,接受任何旧字符串将导致比使用枚举更多的失败。
但是,在这种有限的情况下,您可能还会考虑为每种类型的汽车使用命名工厂方法:如createFerrari(),createPorsche()等。
都不是。 使用Enum并使该方法成为Enum本身的实例方法。 不,如果需要的话。
我会用Enums
; 我不喜欢在这种情况下使用的字符串。 枚举的优点是你可以切换它们(这不适用于字符串),你不需要处理错误的输入。
我不会向枚举添加实例方法。 今天我们在枚举中使用静态块并引用枚举时看到了奇怪的意外行为。 突然一个枚举实例是空的!!! ???
我会使用抽象的工厂模式。 这样,您可以为两个枚举实例使用相同的工厂。
我还会使用hashmap来存储工厂。 这样你就没有这种情况,或者是否会增加循环复杂性。
enum
另一个好处是它允许你使用switch/case
语法而不是无限if/else
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.