Java错误或功能?

时间:2009-01-25 18:09:29

标签: java

好的,这是代码,然后讨论如下:

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 个答案:

答案 0 :(得分:6)

您只创建currentRow数组的一个实例。在行循环中移动它,它应该表现得更像你期望的。

具体来说,setCurrentRow中的分配不会创建对象的副本,而只会分配引用。因此,包装器对象的每个副本都将保存对同一int[]数组的引用。更改该数组中的值将使所有其他包装器对象的值看起来更改,这些包装器对象包含对该数组的同一实例的引用。

答案 1 :(得分:0)

我不想听到居高临下的声音,但总是试着从优秀的​​pragmatic programmer书中记住#26提示

  

选择未破坏

很难找到java bug。牢记这一点经常帮助我再次查看我的代码,转过来,摇出松散的位,直到我终于发现我错在哪里。当然,我也非常鼓励尽早寻求帮助。)