私はそれを回避する方法がわかりません。
詳細についてはヘルプが必要です
最初にMap<String, Shape>
、可能なすべてのコマンドをキーとして、対応する形状を値として含むを作成します。
Map<String, Shape> shapesByCommand = new HashMap<String, Shape>();
shapesByCommand.put("circle", new Circle());
shapesByCommand.put("sun", new Sun());
...
次に、コマンドを受け取ると、対応する形状を取得して表示します。
Shape shape = shapesByCommand.get(commands[0]);
if (shape != null && "visible".equals(commands[1])) {
makeVisible(shape);
}
特に問題の最初の部分では、JB Nizet の回答がおそらく役立つと思います。ただし、質問の2番目の部分の一般的な解決策、つまり、で検索したい文字列に基づいて関数を呼び出す方法を求めてHashMap
いる場合、おそらくやりたいことは、関数オブジェクトをそのHashMap
に格納することです。次に、ルックアップ後にその関数オブジェクトを呼び出します (このディスカッションも役立つ場合があります)。
例を次に示します (シェイプではなく文字列を使用):
public interface Action {
abstract void run(String s);
}
public static void main(String[] args) {
HashMap<String, Action> actions = new HashMap<String, Action>();
actions.put("visible", new Action() {
public void run(String s) {
System.out.println("Running 'visible' on: " + s);
}
});
String input[];
input = new String[2];
input[0] = "sun";
input[1] = "visible";
actions.get(input[1]).run(input[0]);
}
出力:
Running 'visible' on: sun
HashMap
ここではa を使用しません。EnumMap
次に、 のコードで、すべての実装をさまざまなサブクラスenum
のメソッドとして配置できます。enum
public enum Actions {
visible, move, resize;
public doAction(Shape s) {
switch(this) {
case visible:
// handle command
break;
case move:
// etc.
}
}
public enum ShapeEnum {
circle, sun, square;
}
次に、コードで次のことができます。
try {
Actions a = Actions.valueOf(command);
Shapes s = Shapes.valueOf(shape);
a.doCommand(myEnumMap.get(s));
} catch (IllegalArgumentException e) {
// not a command, handle it
}