如何调用在另一个 class 中启动的二维数组?

How to call an 2D - Array which was iniciated in another class?

我对我的问题做了一个最小化的例子: 迷宫 class 使用方法 generateMaze() 创建一个 2D 布尔数组(mazeArray 的内容在本例中无关紧要)。 Walker 的主线程调用该方法,从而从 Maze-class.

创建这个 mazeArray

我不明白如何在 Walker.walk 中调用这个数组?恐怕我有知识差距 感谢您的每一个提示,非常感谢。

public final class Maze{

public static boolean[][] generateMaze(int width, int height) {

    boolean[][] mazeArray = new boolean[width][height];

    for( int x = 0; x < width; x++ ) {
        mazeArray[x][0] = true;
    }
    for( int y = 0; y < height; y++ ) {
        mazeArray[0][y] = true;
    }
    return mazeArray;
}

}

public class Walker {

public static void main(String[] args) {
    Maze mazeObj  = new Maze();
    boolean[][] maze = Maze.generateMaze(2,2);
}

public void walk(Maze maze) {

   // Traverse Array

}

}

说明

这里有几个基本的 OOP 错误。

首先,当您的 generateMaze class 是 static 和 [=67 时,为什么还要创建 Maze class 的实例=] 迷宫作为 boolean[][] 而不是 Maze 的实例。您可能打算将数组作为 class 的字段而不是直接访问数组,而是通过迷宫实例。

接下来,walk 方法是 non-static 和 Walker 实例的一部分。因此,您需要创建该 class 的实例并在该实例上调用该方法。


迷宫生成

您可能打算这样做:

public final class Maze {
  // Arrays as field of maze instances
  private boolean[][] mazeArray;

  // return maze instance instead of array
  public static Maze generateMaze(int width, int height) {
    // create maze instance
    Maze maze = new Maze();
    // manipulate array of that maze instance
    maze.mazeArray = new boolean[width][height];

    for (int x = 0; x < width; x++) {
        maze.mazeArray[x][0] = true;
    }
    for (int y = 0; y < height; y++) {
        maze.mazeArray[0][y] = true;
    }

    // return the maze, not its array
    return maze;
  }
}

这样的电话
Maze maze = Maze.generateMaze(2, 2);

构造函数

或者更好的是,使用构造函数:

public final class Maze {
  private final boolean[][] mazeArray;

  public Maze(int width, int height) {
    mazeArray = new boolean[width][height];

    for (int x = 0; x < width; x++) {
        mazeArray[x][0] = true;
    }
    for (int y = 0; y < height; y++) {
        mazeArray[0][y] = true;
    }
  }
}

然后在你的main中这样称呼它:

Maze maze = new Maze(2, 2);

工厂

如果您确实需要,您仍然可以将其与工厂方法结合使用。但是创建逻辑仍然应该在(可能 private)构造函数中:

public final class Maze {
  private final boolean[][] mazeArray;

  private Maze(int width, int height) {
    mazeArray = new boolean[width][height];

    for (int x = 0; x < width; x++) {
        mazeArray[x][0] = true;
    }
    for (int y = 0; y < height; y++) {
        mazeArray[0][y] = true;
    }
  }

  public static Maze generate(int width, int height) {
    return new Maze(width, height);
  }
}

这样称呼它:

Maze maze = Maze.generate(2, 2);

沃克

现在,您需要 Walker class 的一个实例并在其上调用该方法,为其提供您刚刚生成的迷宫:

Maze maze = new Maze(2, 2);
Walker walker = new Walker();

walker.walk(maze);