Ошибка Java или функция? - PullRequest
       13

Ошибка Java или функция?

2 голосов
/ 25 января 2009

Хорошо, вот код, а затем следует обсуждение:

public class FlatArrayList {

    private static ArrayList<TestWrapperObject> probModel = new ArrayList<TestWrapperObject>();

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub

        int [] currentRow = new int[10];

        int counter = 0;

        while (true) {

          for (int i = 0; i < 10; i++) {
            currentRow[i] = probModel.size();
          }

          TestWrapperObject currentWO = new TestWrapperObject(currentRow);

          probModel.add(counter, currentWO);

          TestWrapperObject testWO = probModel.get(counter);
          // System.out.println(testWO);

          counter++;

          if (probModel.size() == 10) break;

       }

       // Output the whole ArrayList    
       for (TestWrapperObject wo:probModel) {
         int [] currentTestRow = wo.getCurrentRow();
       } 
    }
}

public class TestWrapperObject {

    private int [] currentRow;

    public void setCurrentRow(int [] currentRow) {
        this.currentRow = currentRow;
    }

    public int [] getCurrentRow() {
        return this.currentRow;
    }

    public TestWrapperObject(int [] currentRow) {
        this.currentRow = currentRow;
    }

}

Что должен делать приведенный выше код? То, что я пытаюсь сделать, это загрузить массив в качестве члена некоторого объекта-оболочки (TestWrapperObject в нашем случае). Когда я выхожу из цикла, Аргумент probModel ArrayList имеет количество элементов, которые он должен иметь, но все они имеют одинаковое значение последнего элемента (массив размером 10 с каждым элементом равным 9). Это не тот случай внутри цикла. Если вы выполняете тот же «эксперимент» с примитивным значением int, все работает нормально. Я что-то упускаю из-за массивов как членов объекта? Или я только что столкнулся с ошибкой Java? Я использую Java 6.

Ответы [ 2 ]

6 голосов
/ 25 января 2009

Вы создаете только один экземпляр массива currentRow. Переместите это в цикл строк, и оно должно вести себя так, как вы ожидаете.

В частности, присвоение в setCurrentRow не создает копию объекта, а только назначает ссылку. Таким образом, каждая копия вашего объекта-оболочки будет содержать ссылку на один и тот же массив int[]. Изменение значений в этом массиве приведет к изменению значений для всех других объектов-оболочек, которые содержат ссылку на тот же экземпляр массива.

0 голосов
/ 25 января 2009

Я не хочу звучать снисходительно, но всегда стараюсь помнить совет № 26 от превосходного прагматичного программиста книги

выбор не сломан

очень редко можно найти ошибку Java. всегда помня об этом, я снова просматриваю свой код, переворачиваю его и вытряхиваю пустые кусочки, пока, наконец, не выясню, в чем я был неправ. конечно, просить о помощи достаточно рано, тоже очень поощряется:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...