使用新对象更改也可参考

时间:2014-06-22 12:33:21

标签: java reference libgdx

我有这个对象列表,其中包含一个数组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将再次出错。

2 个答案:

答案 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;对象被外部世界修改。