在一个对象数组上调用一个setter

时间:2018-03-12 12:30:28

标签: java oop

我正在尝试编写基于控制台的农场模拟器游戏。我的课程是:

Board.java

public class Board {
    Spot[][] board = new Spot[50][50];
    Values free = new Values(1000,'_');
    Plant plant = new Plant(10,'@');

    public Board() {
        for(int i = 0; i < MAX_SIZE; ++i)
            for (int j = 0; j < MAX_SIZE; ++j)
                board[i][j] = new Spot(plant);
    }
}

Spot.java

public class Spot {

    Values values;

    public Values getValue() {
        return values;
    }

    public void setValue(Values values) {
        this.values = values;
    }
}

Values.java

public class Values{
    private int price,time;
    private char sign;

    public Values(int price, char sign){
        setPrice(price);
        setSign(sign);
    }
    // All the setters and getters...
}

Plant.java

public class Plant extends Values {
    private boolean onfire;

    public Plant(int price, char sign)
        super(price,sign);
        setOnFire(false);
    }    
    // Setter and getter for onfire...
}

问题:调用(Plant)(board[0][0].getValue()).setOnFire(true)时,它适用于board的{​​{1}}的每个元素。

2 个答案:

答案 0 :(得分:1)

&#34;它适用于每个元素&#34; - 这意味着所有这些引用都指向内存中的单个对象。

查看Board课程中的循环。你创建了多个Spot - 你在循环中调用它的构造函数。但是您的Plant只被声明一次,并作为Spot构造函数中的参数传递。这意味着所有Spot共享一个Plant

尝试board[0][0].getValue() == board[0][1].getValue()查看。我猜结果是true,但你想要的是false

Plant声明移到循环内就足够了(您可能需要对Values执行相同操作。)

答案 1 :(得分:1)

当你只召唤一个植物时,所有植物都被点燃的原因是你已经将所有斑点分配给了板初始化中完全相同的植物,因此只有一个植物开始。
尝试board[i][j] = new Spot( new Plant(...) );,以便每个地点都有自己的默认工厂,彼此独立。
虽然这不是问题的一部分:,出于同样的原因,您在任何setValue()值上开始调用free后会遇到同样的问题!

看起来您正在尝试在电路板类的开头创建默认ValuePlant。除了上述内容之外,还有多种方法,例如:

  1. 明确列出您可以提供给各自构造函数的默认值:
    private char valueSign = '_';
    private char plantSign = '@';等。
    然后你可以board[i][j] = new Spot(new Plant(plantValue, plantSign));
  2. 在专色类中创建默认构造函数。
  3. 保留您的代码,然后克隆默认工厂:
    board[i][j] = new Spot(plant.clone())
  4. 所有这些都应该解决您遇到的问题。无论您选择哪种方法取决于您希望如何组织游戏以及数据应该存在的位置。祝你好运。