2015-11-04 1 views
1

Так что у меня довольно простой фрагмент кода:Использование неиницализированные переменной в конструкторе

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. Есть идеи?

+0

Когда вы называетеDistanceCalculation() – AbtPst

+0

В другом методе, который сравнивает расстояние между тремя солдатами до их цели – Seraphim

+1

На боковой ноте, пожалуйста, используйте camelCase (строчная буква первой буквы) для объектов/переменных - это Java-соглашение и так проще читать для большинство из нас. –

ответ

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), чтобы установить новую цель. Я предполагал, что диапазон был максимальным диапазоном атаки солдата, но если это расстояние до цели, оно также не должно устанавливаться в конструкторе.

+0

Хотя я считаю, что Pauls anwser более полезен в долгосрочной перспективе, это намного проще для того, что мне нужно прямо сейчас, поэтому я принимаю вас – Seraphim

2

Вы можете создать еще один конструктор (в дополнение к уже существующему):

Soldier(String name, double range) 

, а затем в методе DistanceCalculation, выполнить hasTarget() проверку.

4

Возможно, лучше хранить информацию о целевых объектах в отдельной структуре данных, например. a 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); 
+0

Мне очень нравится это решение, хотя мне нужно прочитать, как работают карты, потому что Ive никогда их не использовал. Спасибо – Seraphim

+1

Рад, что я мог помочь. В любом случае, это хорошая идея, чтобы узнать о картах. «HashMap» - очень популярный класс. –

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); 
+1

Это компилируется, но вы все еще передаете 'null' в свой конструктор.Изменение локальных переменных позже, чтобы быть ненулевым, не изменит значение, которое вы уже передали в предыдущий конструктор. – azurefrog

+1

Это будет * компилировать *, но у «Всадника» не будет ссылки на «Лучник», который, я считаю, является намерением. –