我在对象状态更新中面临一个非常奇怪的问题,我需要检查房间代码是否匹配将一些数据放入对象并将其更新为HotelRoom对象的新空白List对象。 / p>
当我有多个搜索条件对象用于预订类似的空间时会出现实际问题,因此下面的代码正在做什么,它正在更新以下对象
List<HotelRoom> rooms = newHotel.getRooms();
当我在最后检查时,我得到以下列表中具有类似标准的所有对象。
List<HotelRoom> hotelRooms = new ArrayList<HotelRoom>(0);
假设第一个标准是2个成人0个孩子,首席旅行者说X先生是第一个房间,第二个房间标准是2个成人2个孩子,Lead Travller说Y先生,当我再次检查物体时我得到了两个上面列表对象中的对象相同,即两个对象有2名成人2儿童和铅旅行者Y先生。
private void enrichObject(ProductDTO productDTO, HttpServletRequest request) {
String selectedRoomCode = request.getParameter("selectedRoomCode");
SearchRequest searchRequest = sessionInterface.getSearchObjectFromSession(request);
if(searchRequest != null){
if(productDTO.getHotel() != null && productDTO.getHotel().getRooms() != null && !productDTO.getHotel().getRooms().isEmpty()){
List<HotelRoom> hotelRooms = new ArrayList<HotelRoom>(0);
HotelDTO newHotel = productDTO.getHotel();
List<HotelRoom> rooms = newHotel.getRooms();
int i = 0;
for(SearchCriteria criteria : searchRequest.getCriterias()){
for(HotelRoom room : rooms){
HotelRoom newRoom = room;
if(room.getProviderRoomId().equals(selectedRoomCode)){
String travellerTitle = request.getParameter("travellerTitle" +i);
String travellerFirstName = request.getParameter("travellerFirstName" + i);
String travellerLastName = request.getParameter("travellerLastName" + i);
TravellerDTO travellerDTO = new TravellerDTO();
travellerDTO.setLeadTraveller(true);
travellerDTO.setTitle(PERSONTITLE.valueOf(travellerTitle));
travellerDTO.setFirstName(travellerFirstName);
travellerDTO.setLastName(travellerLastName);
hotelRooms.add(newRoom);
sessionInterface.setLeadTravellerObject(request, travellerDTO);
i++;
break;
}
}
}
productDTO.getHotel().setRooms(hotelRooms);
}
}
}
所以最后我的问题是为什么在内部循环中丰富的对象也会更新全局对象,这也会覆盖我现有的所有对象。
List<HotelRoom> hotelRooms = new ArrayList<HotelRoom>(0);
答案 0 :(得分:2)
在Java中,所有变量都是引用,所以当你这样做时
HotelRoom newRoom = room;
您实际上只是从room
复制内存地址并保存在newRoom
中,因此,当您更改newRoom
中的内容时,您也会更改room
,因为两个变量都指向同一个地址。
您可以在HotelRoom课程中添加copy()
方法(或仅实施clone()
方法)
public HotelRoom copy() {
Room newRoom = new Room();
newRoom.member0 = this.member0;
...
newRoom.membern = this.membern;
return newRoom;
}
创建一个新实例并复制所有成员,因此,您可以安全地执行HotelRoom newRoom = room.copy()
,现在您将拥有两个具有相同成员但位于不同内存地址的变量,因此newRoom不会发生变化房间的对象。请注意,如果您的一个成员是另一个对象,您还需要复制(或克隆)该成员
答案 1 :(得分:1)
HotelRoom newRoom = room;
您正在处理此作业后对room
的引用。您应该深度复制对象,然后处理克隆的对象。您可以使用clone()
。您应该根据您的对象结构覆盖克隆。您可以按照here中的指南进行操作。
答案 2 :(得分:0)
我认为这是您不敢面对的问题:HotelRoom newRoom = room;
试试HotelRoom newRoom = new HotelRoom();
然后做newRoom = room;
如果这不起作用,请尝试使用getter setter填充newRoom。