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

时间:2011-10-09 11:03:38

标签: 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();
    }
    ....
}

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的缺点:

增加依赖关系,因为更改为enumFERRARI变为ENZO_FERRARI)将需要在客户端进行修改。但是,使用String,我们可以将Ferrari重定向到Enzo Ferrari实例,而无需重新编译客户端代码。当然,我们可以为使用旧enum值并将FERRARI重定向到ENZO-FERRARI enum的客户端做同样的事情,但对我而言,它意味着enum必须保持旧的价值观以使客户兼容......对我来说没有意义。

我想知道您对此主题有何看法?

5 个答案:

答案 0 :(得分:3)

都不是。使用Enum并使该方法成为Enum本身的实例方法。不,如果需要的话。

答案 1 :(得分:3)

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

我不会在枚举中添加实例方法。今天我们在枚举中使用静态块并引用枚举时看到了奇怪的意外行为。突然一个枚举实例是空的!!! ??? 我会使用抽象的工厂模式。这样你可以在两个枚举实例中使用相同的工厂 我还会使用hashmap来存储工厂。这样你就没有这种情况,或者是否会增加循环复杂性。