【问题标题】:Should I be using global variables or passing the variables in java?我应该使用全局变量还是在 java 中传递变量?
【发布时间】:2010-10-21 18:45:42
【问题描述】:

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

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

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

提前致谢。

相对

【问题讨论】:

  • 答案+作为单身人士使用!

标签: java global-variables argument-passing


【解决方案1】:

您不应该根据数据结构进行设计。 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.
} 

【讨论】:

  • 有趣。我已经为每个正方形创建了一个名为 GirdSquare 的类。有一个 2d 的 GirdSquare 数组可以让我更轻松地与路径查找算法进行交互。即使我有一个 Board 对象,我仍然需要访问单个网格方块,我想到的最好方法是使用 2d 数组,如网格引用。
  • 也许吧,但 Board 抽象会完全隐藏这个事实。例如,如果我为 Monopoly 编写了一个计算机表示,它可能更好地表示为 Monopoly 属性的 LinkedList,因为您总是以这种方式遍历棋盘。在这种情况下,董事会抽象仍然有用;你的二维网格不会。
  • 我不确定你的意思。我对抽象和接口类的想法很陌生!也许你可以给我更多的细节? Board 抽象会是什么样子?我将如何使用它?
  • 感谢您的示例!让它更清楚了!通过这种方式,我还可以设计保持每个级别访问网格的方式的方法,但只有一个更改级别的方法。 :)
  • 据我了解,我需要将其设为单例类。我正在研究 atm,但如果有人找到如何做这样的事情并使用单例类的示例,请告诉我。
【解决方案2】:

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

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

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

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

【讨论】:

  • 这就是我的想法,只是你措辞更好。其他人认为这是一种好方法吗?
【解决方案3】:

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

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

【讨论】:

  • 请问您所说的“成员变量”是什么意思?抱歉,我对 java 和编程还是比较陌生。
  • 这些是每个对象的变量。有时它们也称为字段。
  • 对不起,我觉得我在这里真的很昏暗。可以举个例子吗?
  • 哦,对不起,我相信我现在明白了。像 int 或 char。与对象 Integer 或 String 不同。
【解决方案4】:

如果您的确定只有一个“二维网格方阵”,那么您始终可以使用单例模式,从而使其成为全局模式。

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

【讨论】:

  • 哼。我最终可能会将它扩展到多层。我想这种方式不适合这种情况
  • 即使你有多个楼层(本质上是从 2d 到 3d),仍然只有一个全局游戏状态。因此,单例仍然可以工作。
  • 确实如此。我将不得不阅读单例以及如何使用它们。我以前没有处理过它们,也没有被教导过。再次感谢
  • 谁能指点我一个好的单例模式教程?
  • Google 不鼓励你创建单例:code.google.com/p/google-singleton-detector
【解决方案5】:

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

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

【讨论】:

    猜你喜欢
    • 2012-06-13
    • 1970-01-01
    • 2017-12-30
    • 2012-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-05
    相关资源
    最近更新 更多