我应该使用全局变量还是在java中传递变量?

时间:2009-04-25 10:59:58

标签: java global-variables argument-passing

我正在创建一个基于2d平铺的SIM游戏。 我有一个2d gridSquare数组,可以从许多不同的类和方法中访问和更改。 我应该每次都传递2d gridSquares数组,还是让它成为全局?哪种是最佳做法?

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

我还是新手java,所以我还在学习很多东西!

提前致谢。

相对

5 个答案:

答案 0 :(得分:7)

您不应该根据数据结构进行设计。 Java是一种面向对象的语言。尝试在对象交互时考虑您的问题。它不是2D阵列;它是一个Board对象。构建将其状态操纵到问题中的行为,并隐藏您恰好选择了2D数组的事实。

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

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.
} 

答案 1 :(得分:4)

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

如果您从太多地方访问它们,则可能存在设计问题。

答案 2 :(得分:2)

如果你的某些你只能拥有一个'2d gridSquares阵列',那么你总是可以使用单例模式,这样就可以使它成为全局模式。

虽然有争论和反对,你可能会发现有一天你希望能够预加载地图,但单身人士会阻碍(不能创建单身的第二个实例)。

答案 3 :(得分:1)

如果您确实需要,在包含网格的类(A)中将网格声明为public,然后静态导入A类(import static A;)。这将使您能够与网格进行交互,而不至少扩展A类。

您的代码不应该从太多地方访问网格。考虑重新分解代码,以避免必须从整个地方操纵网格。分开你的顾虑。就像你提到的那样使用继承绝对不是一个好主意。

答案 4 :(得分:1)

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

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

我个人不喜欢单身,因为他们很难测试代码...

如果您的代码是多线程的,请务必使2D阵列同步。