ArrayList с объектами не содержит значения - PullRequest
3 голосов
/ 03 декабря 2009

У меня есть класс под названием Техник

   public class Technician {
     private String empLName;
     private String empFName;
     private int empId;
   //I skipped all setters and getters      
  }

В другом классе я получаю имена всех техников и загружаю их в список массивов.

   Technician empl = new Technician();
   ArrayList <Technician> employees = new ArrayList<Technician>();
   //...skip code related to database
   // rs is ResultSet

      while (rs.next()){

          empl.setEmpFName(rs.getString("EMP_LNAME"));
          empl.setEmpLName(rs.getString("EMP_FNAME"));
          empl.setEmpId(rs.getInt("EMP_ID"));
          employees.add(empl);
       }

Когда я отлаживаю, я вижу правильные значения, извлекаемые из базы данных. На первой итерации цикла while мой объект empl получает значение первый сотрудник в базе данных и хранится в сотрудниках ArrayList. На второй итерации первый объект в сотрудниках ArrayList перезаписывается значением второго сотрудника. Таким образом, в моем ArrayList есть два сотрудника с одинаковыми фамилиями и именами. На третьей итерации, той же истории, два сотрудника в ArrayList перезаписываются Значение третьего сотрудника из базы данных.

Буду признателен, если будут какие-либо предложения, как исправить мой код. Спасибо,

Ответы [ 4 ]

11 голосов
/ 03 декабря 2009

Вам необходимо повторно создать экземпляр empl в цикле while.

Проблема с вашим кодом в том, что empl является ссылочным типом. Это указывает на блок памяти. Когда вы устанавливаете значения свойств empl, он просто перезаписывает значения, хранящиеся в этом блоке памяти, вместо создания новой памяти для хранения различных значений. ArrayList просто содержит N ячеек, ссылающихся на один и тот же блок памяти, на который ссылается empl.

Fix:

 while (rs.next()){
   Technician empl = new Technician();
   empl.setEmpFName(rs.getString("EMP_LNAME"));          
   empl.setEmpLName(rs.getString("EMP_FNAME"));          
   empl.setEmpId(rs.getInt("EMP_ID"));          
   employees.add(empl);
}
2 голосов
/ 03 декабря 2009

Причина, по которой это происходит, заключается в том, что empl - это одна и та же ссылка каждый раз, когда вы перебираете массив.Вместо этого вам нужно инициализировать новый объект empl.

Technician empl = new Technician();
   ArrayList <Technician> employees = new ArrayList<Technician>();
   //...skip code related to database
   // rs is ResultSet

      while (rs.next()){
          empl = new Technician();
          empl.setEmpFName(rs.getString("EMP_LNAME"));
          empl.setEmpLName(rs.getString("EMP_FNAME"));
          empl.setEmpId(rs.getInt("EMP_ID"));
          employees.add(empl);
       }
2 голосов
/ 03 декабря 2009

Вы каждый раз помещаете ОДИН ИСПОЛЬЗУЕТЕ empl в сотрудников, а затем меняете значение empl для каждой строки. Сделайте это вместо:

   ArrayList <Technician> employees = new ArrayList<Technician>();
   //...skip code related to database
   // rs is ResultSet

   while (rs.next()){
       Technician empl = new Technician();

       empl.setEmpFName(rs.getString("EMP_LNAME"));
       empl.setEmpLName(rs.getString("EMP_FNAME"));
       empl.setEmpId(rs.getInt("EMP_ID"));
       employees.add(empl);
   }
2 голосов
/ 03 декабря 2009

Вы продолжаете изменять и добавлять один и тот же экземпляр в список. Вам нужно создавать новый экземпляр в каждом цикле.

while (rs.next()) {
    empl = new Technician();
    empl.setEmpFName(rs.getString("EMP_LNAME"));
    empl.setEmpLName(rs.getString("EMP_FNAME"));
    empl.setEmpId(rs.getInt("EMP_ID"));
    employees.add(empl);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...