Hola Fuzzylog, gracias por responder.
Implementé tus recomendaciones y mi método singleton quedó así:
Código Javascript
:
Ver original// Método singleton
private List<Curso> getListaCursos() throws DaoException {
if ( listaCursos == null ) {
listaCursos = new CursoDao().traerTodos();
}
List<Curso> nuevaLista = new ArrayList<Curso>();
for (Iterator<Curso> it = listaCursos.iterator(); it.hasNext();) {
Curso curso;
curso = it.next();
nuevaLista.add(curso);
}
return nuevaLista;
}
Gracias a esta modificación, el método del ejemplo anterior ahora arroja los resultados esperados. Remuevo el primer elemento de listaCursos1, y la listaCursos2 aparece completa.
Output:
Código:
Lista Original: [960001, 960002, 960003, 960004, 960005]
Lista Cursos 1: [960002, 960003, 960004, 960005]
Lista Cursos 2: [960001, 960002, 960003, 960004, 960005]
Pero el panorama cambia cuando no remuevo, sino cuando "seteo" nuevos valores a sus atributos. Pero en este punto me he dado cuenta que
no tiene nada que ver con JPA. Cuando completo la listaCursos "manualmente", es decir, sin hacer consulta a la base de datos, también tengo ese problema.
Ejemplo 2.
Código Javascript
:
Ver original//
private List<Curso> listaCursosManual;
// Método que devuelve una Lista de Cursos, completados de manera "manual"
// Hace las veces de la consulta a la base de datos
private List<Curso> popularListaCursos() {
List<Curso> lista;
lista = new ArrayList<Curso>();
Curso curso;
for (int i = 1; i < 6; i++) {
curso = new Curso(i);
curso.setCodigo("96000"+i);
lista.add(curso);
}
return lista;
}
// Método patrón Singleton
private List<Curso> getListaCursosManual() throws DaoException {
if ( listaCursosManual == null ) {
listaCursosManual = popularListaCursos();
}
List<Curso> nuevaLista = new ArrayList<Curso>();
for (Iterator<Curso> it = listaCursosManual.iterator(); it.hasNext();) {
Curso curso;
curso = it.next();
nuevaLista.add(curso);
}
return nuevaLista;
}
// Ejemplo
public static void main(String[] args) {
try {
List<Curso> listaCursos1;
listaCursos1 = Utilitarios.getInstance().getListaCursosManual();
System.out.println("Lista Original: " + listaCursos1);
// Hago algunos cambios sobre la listaCursos1
listaCursos1.get(0).setCodigo("XXXXXX");
System.out.println("Lista Cursos 1: " + listaCursos1);
// Creo una nueva lista
List<Curso> listaCursos2;
listaCursos2 = Utilitarios.getInstance().getListaCursosManual();
// La (nueva) lista 2 refleja los cambios que se le hicieron a la lista 1.
System.out.println("Lista Cursos 2: " + listaCursos2);
} catch (Exception e) {
e.printStackTrace();
}
}
Output:
Código:
Lista Original: [960001, 960002, 960003, 960004, 960005]
Lista Cursos 1: [XXXXXX, 960002, 960003, 960004, 960005]
Lista Cursos 2: [XXXXXX, 960002, 960003, 960004, 960005]
No me doy cuenta dónde lo estoy haciendo mal...
Muchas gracias por su tiempo.