Добавление нового элемента в ArrayList приводит к перезаписи свойств всех ранее вставленных элементов

#java #arraylist #overwrite

#java #arraylist #перезапись

Вопрос:

У меня возникла проблема со следующим фрагментом, в котором массив элементов создается и заполняется впоследствии созданными элементами. Вывод показывает, что конкретные элементы являются разными экземплярами класса Engine (как и ожидалось), но значение свойства, обозначаемого как in (типа engineerinput), берется из последнего созданного элемента и реплицируется (ссылается?) на предыдущие. Я провел исследование в Интернете и выяснил, что основными причинами такого поведения являются:

  1. многократное использование одного и того же объекта

или

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

Кто-нибудь знает, почему свойство 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 был статическим полем. Я пропустил это (слишком много времени ушло на просмотр этого кода). Большое спасибо!