在构造函数中使用未初始化的变量

时间:2015-11-04 21:01:04

标签: java

所以我有一段相当简单的代码:

    Soldier Horseman = new Soldier("Horseman",Archer, 20);
    Soldier Spearman = new Soldier("Spearman",Horseman, 10);
    Soldier Archer = new Soldier("Archer",Spearman, 10);

士兵的构造函数接受参数

    Soldier(String name, Soldier target, double range)

然后使用目标计算方法中两者之间的距离。

public double DistanceCalculation() {
    distanceToTarget = ((Math.pow((soldierPosition[0] - soldierTarget.soldierPosition[0]), 2)) + Math.pow((soldierPosition[1] - soldierTarget.soldierPosition[1]), 2));
    return distanceToTarget;

然而,当我尝试创建此代码时,无法创建最顶层的士兵,因为它的目标尚不存在。我尝试在构造函数中使用String而不是Soldier,但后来我无法弄清楚如何将字符串转换为Soldier以便SoldierTarget.soldierPosition工作。有什么想法吗?

4 个答案:

答案 0 :(得分:4)

将目标信息存储在单独的数据结构中可能更好一点,例如,一个HashMap<Soldier, Soldier>。然后你可以使Soldier不可变,并且所有圆形问题都会消失。

Soldier horseman = new Soldier("Horseman", 20);
Soldier spearman = new Soldier("Spearman", 10);
Soldier archer = new Soldier("Archer", 10);
Map<Soldier, Soldier> targets = new HashMap<>();
targets.put(horseman, archer);
targets.put(archer, spearman);
targets.put(spearman, horseman);

答案 1 :(得分:3)

不要在构造函数中设置目标。用另一种方法设置它:

Soldier target;
Soldier(String name,double range) {
  // etc
}
public void setTarget( Soldier s ) {
   target = s;
}

然后你可以这样做:

Soldier horseman = new Soldier("Horseman", 20);
Soldier spearman = new Soldier("Spearman", 10);
Soldier archer = new Soldier("Archer", 10);

horseman.setTarget(archer);
spearman.setTarget( horseman );
archer.setTarget(spearman);

这样每个士兵都知道他目前的目标。然后,如果(例如)骑士征服射手,你可以拨打horseman.setTarget(spearman)来设置一个新目标。 我假设范围是士兵的最大攻击范围,但如果它是到目标的距离,则不应在构造函数中设置。

答案 2 :(得分:2)

你可以创建另一个构造函数(除了你已经存在的构造函数):

Soldier(String name, double range)

然后在DistanceCalculation方法中,执行hasTarget()检查。

答案 3 :(得分:0)

如下:

Soldier Horseman = null;
Soldier Spearman = null;
Soldier Archer = null;
Horseman = new Soldier("Horseman",Archer, 20);
Spearman = new Soldier("Spearman",Horseman, 10);
Archer = new Soldier("Archer",Spearman, 10);