2009-12-03 3 views
3

У меня есть класс с именем ТехникаArrayList с объектами не имеет значение

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 перезаписываются значением значения третьего сотрудника из базы данных.

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

+1

+2, если бы мог, для публикации совершенно * чистый * код! –

ответ

11

Вам нужно повторно создать экземпляр 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); 
} 
+1

+1: К сожалению, это распространенная ошибка. – Powerlord

+0

Я совершил ту же ошибку несколько раз сам. – Achilles

+0

Похоже, у каждого был тот же ответ. – Chris

2

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

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

Вы помещаете SAME 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

Причина, по которой это происходит, состоит в том, что 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); 
     } 
Смежные вопросы