Использовать Enum или String для статического фабричного метода? - PullRequest
3 голосов
/ 09 октября 2011

Лучше ли использовать 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 придется сохранить старые значения, чтобы сделать клиент совместимым ... не имеет смысла для меня.

Я хотел бы знать, что вы думаете по этому вопросу?

Ответы [ 5 ]

3 голосов
/ 09 октября 2011

Ни.Используйте Enum и сделайте метод экземпляром метода самого Enum.Нет, если требуется.

3 голосов
/ 09 октября 2011

Если, как и в этом случае, у вас есть фиксированное число приемлемых аргументов для метода, то лучше всего применять это ограничение как можно лучше на клиентах метода. В этом случае принятие любой старой строки вызовет больше ошибок, чем использование enum.

Тем не менее, вы можете также рассмотреть, в этом ограниченном случае, использование именованных заводских методов для каждого типа автомобиля: например, createFerrari (), createPorsche () и т. Д.

1 голос
/ 09 октября 2011

Я бы использовал Enums;Мне не нравятся строки, используемые в этом случае.Преимущество перечислений в том, что вы можете переключать их (что не будет работать со строками), и вам не нужно обрабатывать ложные данные.

0 голосов
/ 06 апреля 2013

Я бы не добавил методы экземпляров в перечисления.Сегодня мы увидели странное неожиданное поведение при использовании статических блоков в перечислениях и обращении к перечислениям.Внезапно экземпляр enum стал нулевым !!! ???
Я бы использовал абстрактный шаблон фабрики.Таким образом, вы можете использовать одну и ту же фабрику для двух экземпляров enum.
Я бы также использовал hashmap для хранения фабрик.Таким образом, у вас нет кейса или if, которые добавляют циклическую сложность.

0 голосов
/ 09 октября 2011

Еще одним преимуществом enum является то, что он позволяет использовать синтаксис switch/case вместо бесконечного if/else.

...