我有以下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);
}
Run Code Online (Sandbox Code Playgroud)
运行之后,数组startingCells只填充一个值:
addCell(3,2);数组的大小= 1后,其中一个元素的坐标为(3,2)addCell(4,2);数组后大小= 2,两个元素的坐标为(4,2)addCell(1,3);阵列具有尺寸= 3的COORDS的三个元件(1,3)等等.
在每次调用addCell之后,数组会增加其大小,并且所有字段都填充了作为参数传递的值,并且我希望这些值仅作为Array的最后一个元素添加.问题出在哪儿?
您正在创建一个单个实例Coords,并在每次addCell调用后添加对该单个对象的引用.您应该每次创建一个新实例Coords,例如
// Remove the cellCoords field
private void addCell(int col, int row) {
Coords cellCoords = new Coords(col, row);
startingCells.add(cellCoords);
}
Run Code Online (Sandbox Code Playgroud)
(这是假设一个合理的Coords构造函数.如果没有一个,你需要创建一个实例,然后调用setCols和setRows......但你仍然会每次都创建一个新的对象,如果Coords是你的控制之下,你可以确保它确实有一个合适的构造函数,并使其更具可读性Coordinate,使用column和row属性,甚至x和y......我建议将其设置为final和immutable.)