Enum, String или что-то другое?

Представим следующую ситацию: пользователь делает в UI выбор из какого-то списка, например, пусть это будет список языков. Для каждого языка существует какой-то свой набор данных и классов, который нужно использовать, т.е. существует соответствие

  • язык_1 — набор_1
  • язык_2 — набор_2
  • ...
  • язык_n — набор_n

Каким образом лучше определять соответствующий набор, учитывая, что список доступных языков хоть и не супер часто, но может меняться?

Создать какой-то enum Language { язык_1, язык_2, ...} в котором при необходимости просто добавлять/удалять языки? и потом использовать его в разных местах, например, через switch / Map<Language, Набор (или Часть набора)>

Или в таких случаях лучше использовать просто String: для каждого языка своё, заранее определённое название, которое обязуются не менять (по сути получится некий аналог Enum)?

Возможно есть какие-то более удачные подходы?

P.S.

возможно я слегка запутал излишними подробностями, поэтому ещё раз краткая суть моего вопроса:

что лучше использовать в подобных ситуациях enum, String или вовсе какое-то иное решение?


Ответы (2 шт):

Автор решения: OwlCodR

Вариант со словарем нормальный. Могу добавить, что с точки зрения ООП, можно выделить "Набор" в отдельный класс, где будете хранить все, что вам нужно.

public class DevKit {
    private List<String> classes;
    private List<String> libraries;
    
    // Constructor, getters and setters
}

Тогда Map<> будет выглядеть так

Map<String, DevKit> map = new HashMap<String, DevKit>();
→ Ссылка
Автор решения: Roman Konoval

Ключевой вопрос здесь, каким образом происходит добавление нового языка? А именно, требует ли это нового релиза приложения, т.е. есть ли изменения в коде или только в конфигурации и/или данных?

Если добавление нового языка требует изменения в коде, как-то добавления этих самых наборов и/или добавление кода в switch или конфигурации нового языка в map-ах, то тогда добавление нового значения в enum - это не проблема, и лучше использовать enum.

Если же добавление нового языка не требует изменения в коде, а достигается только изменением конфигурации приложения, то лучше использовать immutable обертку вокруг String (для контроля типов) реализуя value object, который по сути будет работать как enum (включая метод типа valueOf), с той лишь разницей, что значения в нем произвольные:

public final class Language {
  // можно так добавить какие-то фиксированные значения, если нужно
  public static final Language ENGLISH = Language.valueOf("en");
  public static final Language GERMAN = Language.valueOf("de");

  private final String value;

  private Language(String value) {
    this.value = value;
  }

  public static Language valueOf(String value) {
    return new Language(value);
  }

  // тут определить equals и hashCode на основе value
  ...
}

Map<Language, DevKit> map = ...;

Language language = Language.valueOf(langFromUserInput);
DevKit devKit = map.get(language);
// используем devKit
→ Ссылка