3

我正在创建一个基于 2d 瓷砖的 sim 游戏。我有一个二维的 gridSquares 数组,可以从许多不同的类和方法中访问和更改。我应该每次都传递二维的 gridSquares 数组,还是将其设为全局?哪个是最佳实践?

我在想,是否可以选择创建一个只包含一组所有类都可以扩展的变量的类?这是一个好主意还是坏主意/不是好习惯?

我对java还是很陌生,所以我还在学习很多东西!

提前致谢。

相对

4

5 回答 5

7

您不应该根据数据结构进行设计。Java 是一种面向对象的语言。尝试将您的问题视为对象交互。它不是二维数组;它是一个 Board 对象。将操作其状态的行为构建到问题中,并隐藏您碰巧选择了二维数组的事实。

我没有制定董事会的所有细节,但它会像这样开始:

public class Board
{
    // This is what you're passing around now; Board hides it.
    // Square is the abstraction of a position on the Board
    private Square[][] grid;

    public Board(int nRows, int nCols)        
    {
       this.grid = new Square[nRows][];
       for (int i = 0; i < this.grid[i].length; ++i)
       {
           this.grid[i] = new Square[nCols];
       }
    }

    // Now add methods for adding Pieces to the Board, rules for moving them, etc.
} 
于 2009-04-25T12:20:28.387 回答
4

将它们传递给构造函数并将它们保存在成员变量中。

如果您从太多地方访问它们,您可能会遇到设计问题。

于 2009-04-25T11:13:30.340 回答
2

如果您确定您只有一个“二维网格正方形数组”,您可以始终使用单例模式,本质上使其成为全球性的。

虽然有支持和反对的争论,但您可能会发现有一天您希望能够预加载地图,但是单例会妨碍(无法创建单例的第二个实例)。

于 2009-04-25T11:13:05.117 回答
1

如果您绝对需要,在包含网格的类 (A) 中将网格声明为公共的,然后静态导入 A 类 ( import static A;)。这将使您能够在不扩展 A 类的情况下与网格交互,至少。

您的代码不应该从太多地方访问网格。考虑重构您的代码以避免不得不从各处操作网格。分开你的顾虑。就像你提到的,使用继承绝对不是一个好主意。

于 2009-04-25T11:08:09.120 回答
1

我会推荐它使其成为静态但创建一个明确的类来从中读取数据,比如 GridSquaresAcessor。在这个类中,您编写访问数组的所有方法。更好的是,使其成为此类的私有静态字段,以避免任何其他代码以此类未定义的方式进行操作。

在每个需要访问数组的类中,您可以将一个 GridSquaresAcessor 作为参数传递给构造函数,并将其存储在局部变量中。

我个人不喜欢单例,因为它们使测试代码变得非常困难......

如果您的代码是多线程的,请确保使二维数组同步。

于 2009-04-25T12:35:56.353 回答