#java #arraylist #overwrite
#java #arraylist #перезапись
Вопрос:
У меня возникла проблема со следующим фрагментом, в котором массив элементов создается и заполняется впоследствии созданными элементами. Вывод показывает, что конкретные элементы являются разными экземплярами класса Engine (как и ожидалось), но значение свойства, обозначаемого как in (типа engineerinput), берется из последнего созданного элемента и реплицируется (ссылается?) на предыдущие. Я провел исследование в Интернете и выяснил, что основными причинами такого поведения являются:
- многократное использование одного и того же объекта
или
- создание экземпляра объекта класса, имеющего статические поля. Насколько я вижу, здесь не применяется ни одна из вышеперечисленных причин (в используемых классах единственные статические поля представляют регистраторы).
Кто-нибудь знает, почему свойство in реплицируется на все элементы массива tasks
?
ФРАГМЕНТ
List<Engine> tasks = new ArrayList<>();
for (int i = 0; i < segs.size(); i ) {
Segment s = new Segment(segs.get(i));
EngineInput in = new EngineInput(new Store(store), s);
Engine ce = new Engine(in);
tasks.add(i, ce);
log.debug("-------");
// After completing the i-th step we print a reference of each element of the
//"tasks" array together with a reference of its property "in"
for (int j = 0; j < i; j ) {
log.debug("ttj = " j " CE : " tasks.get(j)
" --> IN : " tasks.get(j).getIn() );
}
}
ВЫВОД
Обратите внимание, что ссылка foo.calcs.EngineInput@
заполняется по всем элементам массива (ПОЧЕМУ ????)
[DEBUG] 2016-10-17 23:32:11.706 [main] Оптимизатор - j = 0 CE : foo.calcs.Движок @34414ffc --> В : foo.calcs.EngineInput@1903b5d [DEBUG] 2016-10-17 23:32:11.792 [основной] Оптимизатор - ------- [DEBUG] 2016-10-17 23:32:11.793 [main] Оптимизатор - j = 0 CE : foo.calcs.Движок @34414ffc --> В : foo.calcs.EngineInput@4041739c [DEBUG] 2016-10-17 23:32:11.793 [main] Оптимизатор - j = 1 CE : foo.calcs.Движок @5cff6b74 --> В : foo.calcs.EngineInput@4041739c [DEBUG] 2016-10-17 23:32:11.879 [основной] Оптимизатор - ------- [DEBUG] 2016-10-17 23:32:11.880 [main] Оптимизатор - j = 0 CE : foo.calcs.Движок @34414ffc --> В : foo.calcs.EngineInput@627ff1b8 [DEBUG] 2016-10-17 23:32:11.881 [main] Оптимизатор - j = 1 CE : foo.calcs.Движок @5cff6b74 --> В : foo.calcs.EngineInput@627ff1b8 [DEBUG] 2016-10-17 23:32:11.881 [main] Оптимизатор - j = 2 CE : foo.calcs.Движок@62b57479 --> В : foo.calcs.EngineInput@627ff1b8 [DEBUG] 2016-10-17 23:32:11.981 [основной] Оптимизатор - ------- [DEBUG] 2016-10-17 23:32:11.982 [main] Оптимизатор - j = 0 CE : foo.calcs.Движок @34414ffc --> В : foo.calcs.EngineInput@29a33620 [DEBUG] 2016-10-17 23:32:11.982 [main] Оптимизатор - j = 1 CE : foo.calcs.Движок @5cff6b74 --> В : foo.calcs.EngineInput@29a33620 [DEBUG] 2016-10-17 23:32:11.982 [main] Оптимизатор - j = 2 CE : foo.calcs.Движок@62b57479 --> В : foo.calcs.EngineInput@29a33620 [DEBUG] 2016-10-17 23:32:11.982 [main] Оптимизатор - j = 3 CE : foo.calcs.Engine@ea04cab --> В : foo.calcs.EngineInput@29a33620 [DEBUG] 2016-10-17 23:32:12.082 [основной] Оптимизатор - -------
Комментарии:
1. И что это
Engine
? (И я надеюсь, что этоEngineInput
поле не такstatic
).2. Бинго, @Tom. Engineerinput был статическим полем. Я пропустил это (слишком много времени ушло на просмотр этого кода). Большое спасибо!