Clonacion Incompleta de objetos en Java, bajo S.O Win 7
Hola les muestro el siguiente caso, para tener en cuenta en un futuro
Tengo la siguiente clase:
public class Test implements Serializable, Cloneable {
private String info;
private Calendar fecha
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
public Calendar getFecha() {
return fecha;
}
public void setFecha(Calendar fecha) {
this.fecha = fecha;
}
@Override
public Test clone() {
try {
return (Test)super.clone();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
y la clase Main que lo ejecuta
public class Main {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
Test test = new Test();
test.setInfo("Informacion ");
test.setFecha(Calendar.getInstance());
Test clon = test.clone(test);
clon.setInfo("Alterando...");
clon.getFecha().set(2000, 10, 1);
System.out.println("Clon Info: "+clon.getInfo());
System.out.println("Clon calendar: "+clon.getFecha().get(Calendar.YEAR));
System.out.println("Test Info: "+test.getInfo());
System.out.println("Test calendar: "+test.getFecha().get(Calendar.YEAR));
}
}
Al ejecutar desde NetBeans la clase Main, teniendo Windows XP o ubuntu (donde tambien lo ejecute), me da como resultado
Clon Info: Informacion
Clon calendar: 2011
Test Info: Alterando...
Clon calendar: 2000
Sin embargo al ejecutar en NetBeans pero teniendo Windows 7 como S.O
Me da como resultado
Clon Info: Informacion
Clon calendar: 2000
Test Info: Alterando...
Clon calendar: 2000
Lo que ocurre es que por alguna extraña razon, en windows 7, el objeto calendar no se clona, sino que se pasa como una referencia normal, para lidiar con esto me toco hacer una sobrecarga al metodo clone
public Test clone(Test test){
Test clone = test.clone();
clone.setDate((Date)test.getDate().clone());
clone.setFecha((Calendar)test.getFecha().clone());
return clone;
}
Si alguno conoce el motivo de este comportamiento, seria bueno que lo compartiece