1. 程式人生 > 實用技巧 >一個留了兩個星期的bug,基礎忘光了

一個留了兩個星期的bug,基礎忘光了

List<ScaleAndEnterpriseDTO> copyDtoList = new ArrayList<>();
        dtoList.sort((o1, o2) -> o2.getCumulativeInvestmentMoney().compareTo(o1.getCumulativeInvestmentMoney()));
        for (int i = 0; i < dtoList.size(); i++) {
            ScaleAndEnterpriseDTO dto = dtoList.get(i);
            dto.setCumulativeNumber(i 
+ 1); dto.setCumulativeProvinceName(getMonthLink(dto.getCumulativeProvinceNumber(), month, dto.getCumulativeProvinceName())); dto.setBalanceProvinceName(getMonthLink(dto.getBalanceProvinceNumber(), month, dto.getBalanceProvinceName())); dto.setCustomerProvinceName(getMonthLink(dto.getCustomerProvinceNumber(), month, dto.getCustomerProvinceName()));
// 注意不能直接往copyDtoList.add(dto),因為這樣會引用的同一個物件,在dtoList裡面對這個dto做了修改,copyDtoList裡面的這個dto也是同樣被修改了 ScaleAndEnterpriseDTO copyDto = new ScaleAndEnterpriseDTO(); BeanUtil.copyProperties(dto, copyDto, false); copyDtoList.add(copyDto); } dtoList.sort((o1, o2)
-> o2.getInvestmentBalance().compareTo(o1.getInvestmentBalance())); for (int i = 0; i < dtoList.size(); i++) { ScaleAndEnterpriseDTO copyDto = copyDtoList.get(i); ScaleAndEnterpriseDTO dto = dtoList.get(i); System.out.println(dto); copyDto.setBalanceNumber(i + 1); copyDto.setBalanceProvinceName(dto.getBalanceProvinceName()); copyDto.setBalanceGroup(dto.getBalanceGroup()); copyDto.setInvestmentBalance(dto.getInvestmentBalance()); copyDto.setBalanceProvinceNumber(dto.getBalanceProvinceNumber()); // System.out.println(copyDto); } dtoList.sort((o1, o2) -> Long.compare(o2.getCustomerPeopleNumber(), o1.getCustomerPeopleNumber())); for (int i = 0; i < dtoList.size(); i++) { ScaleAndEnterpriseDTO copyDto = copyDtoList.get(i); ScaleAndEnterpriseDTO dto = dtoList.get(i); copyDto.setCustomerGroup(dto.getCustomerGroup()); copyDto.setCustomerNumber(i + 1); copyDto.setCustomerProvinceName(dto.getCustomerProvinceName()); copyDto.setCustomerPeopleNumber(dto.getCustomerPeopleNumber()); copyDto.setCustomerProvinceNumber(dto.getCustomerProvinceNumber()); }

當時發現在dtoList第二次排序的時候,會出現屬性重複的問題,然後debug發現這個問題之後,一直想不通為什麼會這樣。明明沒有對dto做任何set,但是在dtoList的第二次排序之後迴圈到第二次,dto就會被改變。

今天突然想到之前有過一次這種寫法:

List<DTO> copyDtoList = dtoList;

這個當時就注意到引用的問題,然後換成了

List<DTO> copyDtoList = new ArrayList<>(dtoList);