我有以下 Junit 类用于测试(不包括测试,因为它们在这种情况下并不重要):
public class BoardImplTest {
List<Coords> startingCells = new ArrayList<>();
Coords cellCoords = new Coords();
private void addCell(int col, int row){
cellCoords.setCols(col);
cellCoords.setRows(row);
startingCells.add(cellCoords);
}
private void testSetup() {
addCell(3,2);
addCell(4,2);
addCell(1,3);
addCell(2,3);
addCell(3,3);
addCell(4,4);
}
运行is后,数组startingCells只填充一个值:
- 第一个之后
addCell(3,2);
数组的 size=1,其中一个元素的坐标为 (3,2) addCell(4,2);
之后数组的大小=2,两个元素的坐标为(4,2)addCell(1,3);
之后数组的大小=3,三个元素的坐标为(1,3)
等等。
每次调用 addCell 后,数组都会增加其大小,并且所有字段都会填充作为参数传递的值,并且我希望这些值仅作为数组的最后一个元素添加。问题出在哪里?
最佳答案
您正在创建 Coords
的单个实例,并在变异后每次调用 addCell
时添加对该单个对象的引用它。您应该每次创建一个Coords
新实例,例如
// Remove the cellCoords field
private void addCell(int col, int row) {
Coords cellCoords = new Coords(col, row);
startingCells.add(cellCoords);
}
(假设有一个合理的 Coords
构造函数。如果没有,您需要创建一个实例,然后调用 setCols
和 setRows
...但每次您仍然会创建一个新对象。如果坐标
在您的控制之下,您可以确保它确实有一个合适的构造函数,并使其更具可读性,如 坐标
,具有 column
和 row
属性,甚至 x
和 >y
...我建议将其设为最终且不可变。)
关于Junit 测试中的 Java ArrayList 填充单个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38563980/