2

我不知道如何绕过它。

需要帮助的细节请

4

3 回答 3

2

您首先创建一个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);
}
于 2012-12-12T22:24:57.213 回答
1

我认为 JB Nizet 的回答可能会对您有所帮助,尤其是对于您问题的第一部分。但是,如果您正在寻求问题第二部分的通用解决方案,即如何根据要在 a 中查找的字符串调用函数HashMap,那么您可能想要做的是将函数对象存储在 that 中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

于 2012-12-12T22:43:48.867 回答
0

我不会在HashMap这里使用 a,我会使用 anEnumMap

然后,在您的代码中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
 }
于 2012-12-12T22:23:29.897 回答