Foros del Web » Programación para mayores de 30 ;) » Java »

Problema con clonación de objetos

Estas en el tema de Problema con clonación de objetos en el foro de Java en Foros del Web. Hola Tengo una clase EmpresaVO definida así (simplificada) public class EmpresaVO implements Comparable, Serializable, Cloneable { private int saldoTitulos = 0; // Saldo de títulos ...
  #1 (permalink)  
Antiguo 19/09/2008, 07:14
 
Fecha de Ingreso: mayo-2007
Mensajes: 11
Antigüedad: 17 años
Puntos: 0
Problema con clonación de objetos

Hola

Tengo una clase EmpresaVO definida así (simplificada)



public class EmpresaVO implements Comparable, Serializable, Cloneable {

private int saldoTitulos = 0; // Saldo de títulos de la empresa

public EmpresaVO(int saldoTitulos) {
super();
this.saldoTitulos = saldoTitulos;
}

// Constructor que asegura la clonación profunda
private EmpresaVO(EmpresaVO toCopy) {
super();
this.saldoTitulos = new Integer(toCopy.getSaldoTitulos()).intValue();
}

public int getSaldoTitulos() {
return this.saldoTitulos;
}

public void setSaldoTitulos(int saldoTitulos) {
this.saldoTitulos = saldoTitulos;
}

public Object clone() {
return new EmpresaVO(this);
}
}



Y tengo una clase EmpresasConjunto definida así (simplificada)



// Clase que implementa el conjunto de empresas de un usuario
public class EmpresasConjunto implements Serializable, Cloneable {

private List empresas = null;

public EmpresasConjunto() {
super();
empresas = new LinkedList();
}

// Constructor que asegura la clonación profunda
private EmpresasConjunto(EmpresasConjunto toCopy) {
super();
this.empresas = new LinkedList(toCopy.getEmpresas());
}

public List getEmpresas() {
return this.empresas;
}

public void setEmpresas(List empresass) {
this.empresas = empresass;
}

// Añade una empresa al conjunto de empresas de un usuario
public boolean anadirEmpresa(EmpresaVO empr) {
if (!empresaExiste(empr)) {
empresas.add(empr);
return true;
}
return false;
}

// Devuelve, a partir de su nombre y de una cartera donde buscar, una empresa
public EmpresaVO obtenerEmpresa(String nombre, String idCart) {
for (int i = 0; i < empresas.size(); i++) {
EmpresaVO empr = (EmpresaVO) empresas.get(i);
if ( (empr.getIdCartera().equalsIgnoreCase(idCart)) &&
(empr.getNombre().equalsIgnoreCase(nombre)) )
return empr;
}
return null;
}

// Actualiza el saldo de títulos de una empresa tras una operación bursátil
public void actualizarSaldoTit(String empr, int numTit, String idCart) {
EmpresaVO empresa = obtenerEmpresa(empr, idCart);
int nuevSaldo = empresa.getSaldoTitulos() + numTit;
empresa.setSaldoTitulos(nuevSaldo);
}

public Object clone() {
return new EmpresasConjunto(this);
}
}



Cuanto activo un simulador guardo en sesión un objeto de la clase EmpresasConjunto para que cuando se desactive mantener las mismas empresas con su mismo saldo de títulos. Lo hago utilizando clone()

EmpresasConjunto empresasUsuario = (EmpresasConjunto) getEmpresasConjunto().clone();
session.setAttribute("estadoEmpresas", empresasUsuario);


Ahora se puede añadir empresas y/o modificar sus saldos de títulos mediante compra de títulos de esas empresas y cuando se desactive el simulador recupero lo almacenado en sesión, pero no sucede así.
Si el usuario introduce nuevas empresas en simulación, la copia en sesión no modifica, pero si compra títulos lo que implica incrementar el atributo de saldo de títulos, eso sí se altera en la copia en sesión.
El error lo tengo localizado, pero no sé a qué se debe ni cómo solucionarlo. Lo comento

Supongamos que estoy en simulación e inserto una compra. Primero se añade la empresa de la que se compran títulos (sólo si no existe, eso se verifica en el método)

getEmpresasConjunto().anadirEmpresa(empresa);

Si saco por salida estandar el contenido de la copia en sesión esta no se ve alterada. Hasta ahí bien. Procedo a actualizar el saldo de títulos de la empresa por la compra realizada

getEmpresasConjunto().actualizarSaldoTit(empr, numTit, idCart);

Saco nuevamente por salida estandar el contenido de la copia... y en esta también se modifica el valor del atributo para el saldo de títulos! La "clave" puede estar en el método "actualizarSaldoTit()" especificado más arriba, pero no tengo ni idea de qué ni por qué

Podeis ayudarme? Gracias
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 02:22.