我有这个对象列表,其中包含一个数组i(想要)作为参考使用。因此,当我创建一个新对象时,在列表中填入一个数组并开始更改该新对象,我不希望我的列表中对象的初始数组发生更改。
我基本上这样做:
//Fill list with my reference objects;
Object newObject = new Object(); //So i do not change the previous newObject in the loop.
newObject = (find)ObjectFromList;
newObject.array = RotateArray(newObject.array);
如果我用列表中的同一个对象填充另一个newObject,它就已经旋转了。我希望我已经足够清楚了。在我的代码的缩短版本下面,仍然有点混乱:
LoadRooms(); //将文件中的所有对象和数组加载到列表中。
for(int x=0;x<width;x++)
{
for(int y=0;y<height;y++)
{
Room newRoom = new Room();
//Fill newroom with correct room type, rotate and build tilemap.
//Dead ends
if(!mazeMap[x][y].N && !mazeMap[x][y].E && mazeMap[x][y].S && !mazeMap[x][y].W)
{
newRoom = FindRoom(Room.RoomType.DeadEnd);
newRoom.room = TurnRoomCW(newRoom.room);
newRoom.room = TurnRoomCW(newRoom.room);
newRoom.room = TurnRoomCW(newRoom.room);
}
else if(!mazeMap[x][y].N && mazeMap[x][y].E && !mazeMap[x][y].S && !mazeMap[x][y].W)
{
newRoom = FindRoom(Room.RoomType.DeadEnd);
}
//Etc, etc then i build a map from the newRoom.room array
}
}
这就是TurnRoom()的样子:
private String[][] TurnRoomCW(String[][] room)
{
String[][] rotatedRoom = new String[room[0].length][room.length];
for (int y = 0; y < room[0].length;y++)
{
for (int x = 0;x < room.length;x++)
{
rotatedRoom[y][x] = room[7 - x][y];
}
}
return rotatedRoom;
}
这里是FindRoom
private Room FindRoom(Room.RoomType roomType)
{
Collections.shuffle(rooms, rand);
for (Room r : rooms)
{
if (r.roomType.equals(roomType))
return r;
}
return null;
}
当我想转弯类型的房间时,将NE置于正确的位置,所有其他房间都随之转动。因此,当我想转弯时,将SW说到位置,NE将再次出错。
答案 0 :(得分:1)
您的FindRoom
方法正在返回对实际房间的引用。
'TurnRoomCW'返回一个新对象,但您将该新对象分配回原始房间
所以你的问题就在这里:
newRoom = FindRoom(Room.RoomType.DeadEnd); // 1) find a DeadEnd room
newRoom.room = TurnRoomCW(newRoom.room); // 2) create rotated room, assign it to the room from step 1)
如果您想使用新的Room
对象,则需要以某种方式创建一个新对象。例如,您可以为Room
定义一个构造函数,该构造函数返回从现有对象初始化的新对象。例如,
/** copy constructor */
public Room(Room oldRoom) {
this(); // regular constructor
this.room = oldRoom.room.clone(); // new Room gets its own array!
this.roomType = oldRoom.roomType;
// … etc for any other member variables
}
答案 1 :(得分:0)
基本上,Java对象是引用(如果您愿意,也可以是指针),因此除非您制作数组(或任何其他对象)的显式副本,否则它将指向同一个对象。
如果你想避免这种情况,你必须先做一个克隆:
List myList = referenceList.clone();
这通常是一个好习惯,以避免让你的内部&#34;对象被外部世界修改。