Как установить разные значения в одной и той же ссылке - PullRequest
0 голосов
/ 26 сентября 2019

У меня есть три класса TestDTO, TestImpl и TestMain.TestDTO имеет переменную количества, методы установки и получения.TestImpl имеет такие методы, как getTestDTO() и getUpdatedTestDTO().

Я создал объект testdto и установил значение суммы как 05.testdto хранит объект testDTO ArrayList.Здесь в TestImpl у меня есть два сеттера и геттер для userTest и currentTest.Я установил 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.

Ответы [ 2 ]

0 голосов
/ 26 сентября 2019

Проблема как в пользовательском тесте ArrayList, так и в текущем тесте.У вас есть 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
0 голосов
/ 26 сентября 2019

НЕТ, это невозможно, сэр.Когда вы устанавливаете сумму, она устанавливается для того же testDTO , поэтому вы всегда будете получать одно и то же значение.

Чтобы достичь ожидаемого результата, попробуйте следующее решение.

    ArrayList<TestDTO> testDTO = new ArrayList<TestDTO>();  
    TestDTO testdto = new TestDTO();
    testdto.setAmount("05");
    testDTO.add(testdto);
    this.setUserTest(testDTO);
    ****ArrayList<TestDTO> testDTO22 = new ArrayList<TestDTO>();  
    ****TestDTO testdto22 = new TestDTO();
    ****testdto22.setAmount("05");
    ****testDTO22.add(testdto);
    ****this.setCurrentTest(testDTO22);

Ищите отмеченные звездочкой линии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...