5

在工厂方法中使用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我们可以重定向FerrariEnzo Ferrari实例而无需重新编译客户端代码。当然,我们可以为使用旧enum值的客户端做同样的事情FERRARIENZO-FERRARI enum但对我来说,这意味着enum必须保留旧值以使客户端兼容......对我来说没有意义。

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

4

5 回答 5

4

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

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

于 2011-10-09T11:08:01.753 回答
3

两者都不。使用 Enum 并使该方法成为 Enum 本身的实例方法。没有如果是必需的。

于 2011-10-09T11:06:58.510 回答
1

我会用Enums;我不喜欢这种情况下使用的字符串。枚举的优点是您可以切换它们(这不适用于字符串)并且您不需要处理错误输入。

于 2011-10-09T11:06:26.810 回答
0

的另一个好处enum是它允许您使用switch/case语法而不是无限的if/else

于 2011-10-09T12:00:15.877 回答
0

I wouldn't add instance methods to enums. Today we saw strange unexpected behaviour when using static blocks in enums and refering to enums. Suddenly an enum instance was null!!!???
I would use an abstract factory pattern. This way you could use the same factory for two enum instances.
I would also use a hashmap to store the factories. This way you don't have the case or if's which add cyclic complexity.

于 2013-04-05T20:55:31.353 回答