コンストラクターからメンバー変数を設定するには、さまざまな方法があります。私は実際に、最終的なメンバー変数、具体的にはヘルパークラスによってエントリがロードされるマップを適切に設定する方法について議論しています。
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;
}
}
私の考えでは、コンストラクターでそのような変数を設定するメソッドを使用する方が良い方法です。したがって、Baseクラスは次のようになります。
public class Base {
private final Map<String, Command> availableCommands;
public Base() {
this.setCommands();
}
private void setCommands() {
this.availableCommands = Helper.loadCommands();
}
}
しかし、現在、最終修飾子を維持できず、コンパイラエラーが発生します(最終変数を設定できません)
これを行う別の方法は次のとおりです。
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>();
かです。私の主な質問は、機能の一部がこのヘルパーの静的メソッドからのものであり、実際のマップにエントリをロードする方法として、これを行うための推奨される方法があるかどうかです。
BaseクラスまたはHelperクラスで新しいマップを作成しますか?どちらの場合も、ヘルパーが実際の読み込みを行い、具体的なコマンドを保持しているマップへのBaseの参照は非公開で最終的なものになります。
私が検討しているオプション以外に、これを行うためのよりエレガントな方法はおそらく他にありますか?