我有三个类,分别是TestDTOTestImplTestMainTestDTO具有数量变量,设置器和获取器方法。 TestImpl具有类似getTestDTO()getUpdatedTestDTO()的方法。

我创建了一个testdto对象,并将金额值设置为05。此testdto已存储testDTO ArrayList对象。在TestImpl中,我有两个用于userTestcurrentTest的setter和getter。我已经将testDTO ArrayList对象设置为setUserTestsetCurrentTest。当我尝试从userTestcurrentTest打印金额值时,我得到了5作为输出。

我像getUserTest().get(0).setAmount("06");一样注入了,然后当我尝试打印currentTest.getAmount()时,它会打印06而不是05

TestDTO:

public class TestDTO{
   private String amount;
   public void setAmount(String amount) {
      this.amount = amount;
   }
   public String getAmount() {
      return amount;
   }
}


TestImpl:

public class TestImpl {
   private ArrayList<TestDTO> userTest;
   private ArrayList<TestDTO> currentTest;

   public ArrayList<TestDTO> getTestDTO(){
      ArrayList<TestDTO> testDTO = new ArrayList<TestDTO>();
      TestDTO testdto = new TestDTO();
      testdto.setAmount("05");
      testDTO.add(testdto);
      this.setUserTest(testDTO);
      this.setCurrentTest(testDTO);
      return null;
   }
   public void getUpdateTestDTO() {
      System.out.println(this.userTest.get(0).getAmount());
      System.out.println(this.currentTest.get(0).getAmount());
   }
   public ArrayList<TestDTO> getUserTest(){
      return userTest;
   }
   public void setUserTest(ArrayList<TestDTO> userTest) {
      this.userTest = userTest;
   }
   public ArrayList<TestDTO> getCurrentTest(){
      return currentTest;
   }
   public void setCurrentTest(ArrayList<TestDTO> currentTest) {
      this.currentTest = currentTest;
   }
}


TestMain:

public class TestMain {
   TestImpl testImpl = new TestImpl();

   public static void main(String args[])
   {
      TestMain testMain = new TestMain();
      testMain.testImpl.getTestDTO();
      testMain.testImpl.getUpdateTestDTO();
      testMain.testImpl.getUserTest().get(0).setAmount("06");
      testMain.testImpl.getUpdateTestDTO();
   }
}


我希望userTest.getAmount()返回06currentTest.getAmount()返回05

最佳答案

ArrayList userTest和currentTest中都存在此问题。您有一个Arraylist存储指向相同对象的引用。

currentTest ---> testDTOArrayList@ioaudo
userTest ---->   testDTOArrayList@ioaudo

testDTOArrayList@ioaudo --> testDTOArrayList
testDTOArrayList ---> testdto@oisudf

testdto@oisudf ---> ---------------
                    | amount = 05 |
                    ---------------


所以我们编译器运行一行

testImpl.getUserTest().get(0).setAmount("06");


该更改也反映在currentTest中,因为它们指向同一事物。

为了避免这种情况,您需要有单独的数组列表,这样一个数组中的更改不会反映在另一个数组中。

// This function will copy all values from one object and create a new object
// Stored copied values in it put in array list and return that arraylist
public ArrayList<TestDTO> deepCopy(TestDTO testdto) {
   TestDTO testdtoCopy = new TestDTO();
   testdtoCopy.setAmount(testdto.getAmount());
   ArrayList<TestDTO> testDTOCopyArrayList = new ArrayList<TestDTO>();
   testDTOCopyArrayList.add(testdtoCopy);
   return testDTOCopy;
}


您的getTestDTO将是

public ArrayList<TestDTO> getTestDTO() {
   ArrayList<TestDTO> testDTOArrayList = new ArrayList<TestDTO>();
   TestDTO testdto = new TestDTO();
   testdto.setAmount("05");
   testDTOArrayList.add(testdto);
   this.setUserTest(testDTOArrayList);
   this.setCurrentTest(deepCopy(testdto));
   return testDTOArrayList;
}


现在两个对象将分开

userTest  ---> testDTOArrayList@ioaudo
currentTest ---->  testDTOCopyArray@weuirwi

testDTOArrayList@ioaudo --> testDTOArrayList
testDTOCopyArray@weuirwi ---> testDTOCopyArray

testDTOArrayList --> testdto@oisudf
testdto@oisudf ---> ---------------
                    | amount = 05 |
                    ---------------

testDTOCopyArray --> testdto@5446dfg
testdto@5446dfg --->  ---------------
                      | amount = 05 |
                      ---------------


输出:

05
05
06
05

07-24 20:15