对象在java中不断更新循环对象
我在对象状态更新中遇到了一个非常奇怪的问题,我需要检查房间代码是否匹配。在对象中放入一些数据,并将其更新到HotelRoom对象的新空白列表对象中 当我有多个相似房间的搜索条件对象来预订时,实际的问题就会出现,所以下面的代码正在做什么,它正在更新下面的对象对象在java中不断更新循环对象,java,object,foreach,Java,Object,Foreach,我在对象状态更新中遇到了一个非常奇怪的问题,我需要检查房间代码是否匹配。在对象中放入一些数据,并将其更新到HotelRoom对象的新空白列表对象中 当我有多个相似房间的搜索条件对象来预订时,实际的问题就会出现,所以下面的代码正在做什么,它正在更新下面的对象 List<HotelRoom> rooms = newHotel.getRooms(); List rooms=newHotel.getRooms(); 当我在最后检查时,我得到了下面列表中具有类似条件的所有对象 List&l
List<HotelRoom> rooms = newHotel.getRooms();
List rooms=newHotel.getRooms();
当我在最后检查时,我得到了下面列表中具有类似条件的所有对象
List<HotelRoom> hotelRooms = new ArrayList<HotelRoom>(0);
List hotelRooms=newarraylist(0);
假设第一个标准是2名成人0名儿童,第一个房间的领队旅客说X先生,第二个房间的标准是2名成人2名儿童,领队旅客说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);
}
}
}
private void enrichObject(ProductDTO-ProductDTO,HttpServletRequest){
字符串selectedRoomCode=request.getParameter(“selectedRoomCode”);
SearchRequest SearchRequest=sessionInterface.getSearchObjectFromSession(请求);
if(searchRequest!=null){
if(productDTO.getHotel()!=null&&productDTO.getHotel().getRooms()!=null&&productDTO.getHotel().getRooms().isEmpty()){
列出酒店房间=新建阵列列表(0);
HotelDTO newHotel=productDTO.getHotel();
List rooms=newHotel.getRooms();
int i=0;
for(SearchCriteria条件:searchRequest.getCriterias()){
用于(酒店房间:房间){
HotelRoom newRoom=客房;
if(room.getProviderRoomId().equals(selectedRoomCode)){
字符串travellerTitle=request.getParameter(“travellerTitle”+i);
字符串travellerFirstName=request.getParameter(“travellerFirstName”+i);
字符串travellerLastName=request.getParameter(“travellerLastName”+i);
TravellerDTO TravellerDTO=新TravellerDTO();
travellerDTO.SetLeadTraveler(真);
travellerDTO.setTitle(PERSONTITLE.valueOf(travellerTitle));
travellerDTO.setFirstName(travellerFirstName);
travellerDTO.setLastName(travellerLastName);
hotelRooms.add(新建房间);
SetLeadTravelerObject(请求,TravelerDTO);
i++;
打破
}
}
}
productDTO.getHotel().setRooms(hotelRooms);
}
}
}
最后,我的问题是,为什么在内部循环中丰富的对象也会更新全局对象,这也会覆盖所有现有的对象
List<HotelRoom> hotelRooms = new ArrayList<HotelRoom>(0);
List hotelRooms=newarraylist(0);
我想这就是你面临的问题:HotelRoom newRoom=room代码>
尝试HotelRoom newRoom=newhotelroom()代码>
然后做newRoom=room代码>
如果这不起作用,请尝试使用getter setters填充newRoom。我认为这就是您面临的问题:HotelRoom newRoom=room代码>
HotelRoom newRoom = room;
尝试HotelRoom newRoom=newhotelroom()代码>
然后做newRoom=room代码>
如果这不起作用,请尝试使用getter setters填充newRoom。我认为这就是您面临的问题:HotelRoom newRoom=room代码>
HotelRoom newRoom = room;
尝试HotelRoom newRoom=newhotelroom()代码>
然后做newRoom=room代码>
如果这不起作用,请尝试使用getter setters填充newRoom。我认为这就是您面临的问题:HotelRoom newRoom=room代码>
HotelRoom newRoom = room;
尝试HotelRoom newRoom=newhotelroom()代码>
然后做newRoom=room代码>
如果这不起作用,请尝试使用getter setters填充newRoom
HotelRoom newRoom = room;
本次作业后,您正在处理对该房间的引用。您应该深度复制对象,然后处理克隆的对象。您可以使用clone()
。您应该根据对象结构覆盖克隆。您可以遵循中的指导原则
本次作业后,您正在处理对该房间的引用。您应该深度复制对象,然后处理克隆的对象。您可以使用clone()
。您应该根据对象结构覆盖克隆。您可以遵循中的指导原则
本次作业后,您正在处理对该房间的引用。您应该深度复制对象,然后处理克隆的对象。您可以使用clone()
。您应该根据对象结构覆盖克隆。您可以遵循中的指导原则
本次作业后,您正在处理对该房间的引用。您应该深度复制对象,然后处理克隆的对象。您可以使用clone()
。您应该根据对象结构覆盖克隆。您可以遵循中的指导原则。在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不会更改room对象。请小心,如果您的一个成员是另一个对象,您还需要复制(或克隆)该成员