我有三个类,分别是TestDTO
,TestImpl
和TestMain
。 TestDTO
具有数量变量,设置器和获取器方法。 TestImpl
具有类似getTestDTO()
和getUpdatedTestDTO()
的方法。
我创建了一个testdto
对象,并将金额值设置为05
。此testdto
已存储testDTO
ArrayList对象。在TestImpl
中,我有两个用于userTest
和currentTest
的setter和getter。我已经将testDTO
ArrayList对象设置为setUserTest
和setCurrentTest
。当我尝试从userTest
和currentTest
打印金额值时,我得到了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()
返回06
和currentTest.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