繁体   English   中英

使用Enum或String作为静态工厂方法?

[英]Use Enum or String for a static factory method?

使用enumString调度到正确的对象以在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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM