Существуют разные способы установить переменную-член из конструктора. Я на самом деле обсуждаю, как правильно установить конечную переменную-член, в частности карту, которая загружается с записями вспомогательного класса.
public class Base {
private final Map<String, Command> availableCommands;
public Base() {
availableCommands = Helper.loadCommands();
}
}
В приведенном выше примере вспомогательный класс выглядит следующим образом:
public class Helper {
public static Map<String, Command> loadCommands() {
Map<String, Command> commands = new HashMap<String, Command>();
commands.put("A", new CommandA());
commands.put("B", new CommandB());
commands.put("C", new CommandC());
return commands;
}
}
Я думаю, что лучше использовать метод для установки такой переменной в конструкторе. Таким образом, базовый класс будет выглядеть примерно так:
public class Base {
private final Map<String, Command> availableCommands;
public Base() {
this.setCommands();
}
private void setCommands() {
this.availableCommands = Helper.loadCommands();
}
}
Но теперь я не могу поддерживать модификатор final и получаю ошибку компилятора (переменная Final не может быть установлена)
Другой способ сделать это будет:
public class Base {
private final Map<String, Command> availableCommands = new HashMap<String, Command>();
public Base() {
this.setCommands();
}
private void setCommands() {
Helper.loadCommands(availableCommands);
}
}
Но в этом случае метод в классе Helper изменится на:
public static void loadCommands(Map<String, Command> commands) {
commands.put("A", new CommandA());
commands.put("B", new CommandB());
commands.put("C", new CommandC());
}
Таким образом, разница в том, где я могу создать новую карту с new HashMap<String, Command>();
? Мой главный вопрос, если есть рекомендуемый способ сделать это, учитывая, что часть функциональности происходит от статического этого помощника метод, как способ загрузить актуальную карту с записями?
Создаю ли я новую карту в своем Базовом классе или в классе Helper? В обоих случаях Helper будет выполнять фактическую загрузку, а ссылка Base на карту с конкретными командами будет закрытой и окончательной.
Возможно, есть ли другие, более элегантные способы сделать это, кроме вариантов, которые я рассматриваю?