Java可以在数组中存储方法吗?

2022-09-03 17:27:41

好吧,我写了一些代码,我所做的只是循环,但改变了我调用的方法。我尝试使用for循环,这样它会更整洁一些(并且出于好奇,看看它是否可以完成),但是当我这样做时,它不会编译,因为它不能将数组中的项目识别为方法,我认为。这就是我所拥有的:

String[] moveArray = {moveRight,moveDown,moveLeft,moveUp};
for (i = 0; i < 4; i++) {
    while (myWumpus.moveArray[i]) {
        myWumpus.moveArray[i];
        generator.updateDisplay();
    }
}

当我尝试编译时,我得到

not a statement myWumpus.moveArray[i]();
';' expected myWumpus.moveArray[i]();

(它指的是 while 循环中的第一个语句)

所以,我想这可能是因为我把它变成了一个字符串类型的数组?是否有类型方法?这有可能吗?任何解决方案都欢迎:)。另外,我可以使用4 while循环让它工作,所以你不需要向我展示那个解决方案。谢谢!


答案 1

不能将方法直接存储在数组中。但是,您可以存储对象,这些对象以不同的方式实现相同的方法。例如:

Mover[] moveArray = {new RightMover(), new DownMover() new LeftMover(), new UpMover() };
for (i = 0; i < 4; i++) {
    while (myWumpus.moveArray[i]) {
        moveArray[i].move();
        generator.updateDisplay();
    }
}

答案 2

是的,您可以使用反射将方法存储在数组中,但是在这种情况下,您实际上想要做的很可能是使用多态性

作为与您的问题相关的多态性的示例 - 假设您创建了一个接口,如下所示:

public interface MoveCommand {
    void move();
}

然后,您可以按如下方式创建实现:

public class MoveLeftCommand implements MoveCommand {
    public void move() {
        System.out.println("LEFT");
    }
}

等,用于其他移动选项。然后,您可以将这些存储在 or 集合中,如 ,然后循环访问每个元素上调用 move() 的数组/集合,例如:MoveCommand[]List<MoveCommand>

public class Main {

    public static void main(String[] args) {
        List<MoveCommand> commands = new ArrayList<MoveCommand>();
        commands.add(new MoveLeftCommand());
        commands.add(new MoveRightCommand());
        commands.add(new MoveLeftCommand());

        for (MoveCommand command:commands) {
            command.move();
        }
    }

}

多态性非常强大,上面是一个非常简单的例子,称为命令模式。享受您的Wumpus World实施:)的其余部分