Java - 如何让class 1和class 2彼此了解?

时间:2014-11-04 15:50:08

标签: java class reference parameter-passing simulation

我有一个程序,我正在编写中,旨在模拟查找食物的错误。简而言之,我有一个网格(一个世界),其中存在不同能量值的错误,障碍和食物。每个虫子都会向各个方向看,在距离最远的地方找到最近的食物。然后将一个单元移向它,否则沿着随机方向移动。

我有3个字段:

  • ABug

  • AWorld

  • 主要

ABug和AWorld显然包含了用食物和障碍物填充网格的所有方法,感知食物,移动bug等等,而Main类是创建世界的控制器,根据用户输入创建了许多错误,将它们添加到世界。

我的问题是:

有没有更好的方法让bug知道它所处的世界,而一个世界也知道它中的错误,而不是将世界的引用传递给bug中需要它的每个函数?

我目前在世界类中有一个bug的arraylist,然后将2D数组传递给bug类中需要它的函数。

很抱歉很长的解释,不确定人们会想要多少细节所以我只是把它全部放在一起:)

感谢您的任何建议

2 个答案:

答案 0 :(得分:2)

我会在Bug构造函数或setter方法中将对World实例的引用传递给每个Bug对象。这样每个bug实例都知道它是相应的世界实例并可以询问某些事情(例如,要求食物......)。

我不会让世界变成单身人士(定义见:http://en.wikipedia.org/wiki/Singleton_pattern)。因为没有必要也没有用来限制自己只有一个世界的例子。如果使用不当,Singleton模式会限制设计的可测试性,引入细微的线程(和类加载)问题,......

答案 1 :(得分:1)

除了将每个Bug方法作为参数传递给World,您还可以在Bug的构造函数中执行一次,并将其保存在ABug的变量字段中,如下所示:

在Main:

public static void main(String[] args){
    AWorld world = new AWorld(...);
    ABug[] bugs = new ABug[amount];
    for(int i = 0; i < amount; i++)
        bugs[0] = new ABug(..., world);
}

在ABug:

private AWorld world;

public ABug(..., AWorld w){
    this.world = w;
    ...
}

public void someMethodNeedingWorld(...){
    world.methodYouNeedFromWorld();
    ...
}

您还可以尝试#StackFlowed所说的内容并使AWorld成为单身人士:

在世界:

private static AWorld instance;

private AWorld(){ } // private constructor for Singleton pattern

public static AWorld getInstance(){
    if(instance == null)
        instance = new AWorld();

    return instance;
}

在Main:

public static void main(String[] args){
    ABug[] bugs = new ABug[amount];
    for(int i = 0; i < amount; i++)
        bugs[0] = new ABug(...);
}

在ABug的方法中你需要AWorld:

public void someMethodNeedingWorld(...){
    AWorld.getInstance().methodYouNeedFromWorld();
    ...
}

我个人会选择Singleton模式,因为这是他们的设计目标。这也确保您在整个应用程序中只有一个AWorld实例。 (如果你想在某个州建立多个世界,我会建议第一种方法。)

编辑:

如果你想通过在同一个应用程序中使用多个AWorld来进行未来的调整,或者使用UnitTests,那么Singleton Pattern并不是一个好主意,因为它一次只能用于1个AWorld实例,并且不会#39;无论是否为UnitTest。所以在这种情况下,我推荐第一个选项,只需将AWorld对象发送到ABug的构造函数并将其保存在ABug中,而不是将其作为参数发送给ABug的每个方法。尽管如此,如果你从不想使用UnitTests或进行调整(不能推荐它,但它取决于你......),可以在这里使用Singleton模式。