Enum, String или что-то другое?
Представим следующую ситацию: пользователь делает в UI выбор из какого-то списка, например, пусть это будет список языков. Для каждого языка существует какой-то свой набор данных и классов, который нужно использовать, т.е. существует соответствие
- язык_1 — набор_1
- язык_2 — набор_2
- ...
- язык_n — набор_n
Каким образом лучше определять соответствующий набор, учитывая, что список доступных языков хоть и не супер часто, но может меняться?
Создать какой-то enum Language { язык_1, язык_2, ...} в котором при необходимости просто добавлять/удалять языки? и потом использовать его в разных местах, например, через switch / Map<Language, Набор (или Часть набора)>
Или в таких случаях лучше использовать просто String: для каждого языка своё, заранее определённое название, которое обязуются не менять (по сути получится некий аналог Enum)?
Возможно есть какие-то более удачные подходы?
P.S.
возможно я слегка запутал излишними подробностями, поэтому ещё раз краткая суть моего вопроса:
что лучше использовать в подобных ситуациях enum, String или вовсе какое-то иное решение?
Ответы (2 шт):
Вариант со словарем нормальный. Могу добавить, что с точки зрения ООП, можно выделить "Набор" в отдельный класс, где будете хранить все, что вам нужно.
public class DevKit {
private List<String> classes;
private List<String> libraries;
// Constructor, getters and setters
}
Тогда Map<> будет выглядеть так
Map<String, DevKit> map = new HashMap<String, DevKit>();
Ключевой вопрос здесь, каким образом происходит добавление нового языка? А именно, требует ли это нового релиза приложения, т.е. есть ли изменения в коде или только в конфигурации и/или данных?
Если добавление нового языка требует изменения в коде, как-то добавления этих самых наборов и/или добавление кода в 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