Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对象在java中不断更新循环对象_Java_Object_Foreach - Fatal编程技术网

对象在java中不断更新循环对象

对象在java中不断更新循环对象,java,object,foreach,Java,Object,Foreach,我在对象状态更新中遇到了一个非常奇怪的问题,我需要检查房间代码是否匹配。在对象中放入一些数据,并将其更新到HotelRoom对象的新空白列表对象中 当我有多个相似房间的搜索条件对象来预订时,实际的问题就会出现,所以下面的代码正在做什么,它正在更新下面的对象 List<HotelRoom> rooms = newHotel.getRooms(); List rooms=newHotel.getRooms(); 当我在最后检查时,我得到了下面列表中具有类似条件的所有对象 List&l

我在对象状态更新中遇到了一个非常奇怪的问题,我需要检查房间代码是否匹配。在对象中放入一些数据,并将其更新到HotelRoom对象的新空白列表对象中

当我有多个相似房间的搜索条件对象来预订时,实际的问题就会出现,所以下面的代码正在做什么,它正在更新下面的对象

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对象。请小心,如果您的一个成员是另一个对象,您还需要复制(或克隆)该成员