Vc esta tentando chamar clone a partir de um objeto Utente, que provavelmente não suporta clone.
Para um objeto suportar clone ele tem que implementar a interface Cloneable, por default os objetos não suportam, ai porque ele estar como protected tb… mas implementando Cloneable vcsobrescreve o método clone do objeto e ai pode alterar o modificador para public
Só para entender bem, segue um exemplo simples de forma errada e certa de clone:
Erro: Dentro da minha classe que implementa Cloneable (Teste) tenho um atributo que é outro objeto, perceba que quando crio o objeto original (t), eu seto todos valores como 10, depois faço um clone e altero o valor e o valor de inner para 20 no objeto clone, quando mostro os valores do clone e do objeto original (t), o valor foi clonado porém o valor de inner não foi, pois não clonei o objeto inner, e de acordo com a documentação, o clone só vai clonar para vc objetos imutaveis (String, Integer, etc) e tipos primitivos, mas meu objeto inner não é nenhum dos dois, logo não foi clonado e o mesmo objeto de T original é referenciado pelo meu objeto clonado, logo quando alterei o valor de inner no objeto clone, foi alterado tb o valor inner do objeto original.
class Inner implements Cloneable {
int valor;
}
public class Teste implements Cloneable {
int valor;
Inner inner;
@Override
protected Teste clone() {
try {
return (Teste) super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
return null;
}
}
public static void main(String[] args) {
Teste t = new Teste();
t.valor = 10;
t.inner = new Inner();
t.inner.valor = 10;
Teste clone = t.clone();
clone.valor = 20;
clone.inner.valor = 20;
System.out.println("Valor em t: " + t.valor + " Valor em clone: "
+ clone.valor);
System.out.println("Valor inner em t: " + t.inner.valor
+ " Valor inner em clone: " + clone.inner.valor);
}
}
Corrigir isso é na hora de clonar o Teste, vc tem que clonar tb os atributos que não são primitivos e imutáveis, segue o código correto:
class Inner implements Cloneable {
int valor;
@Override
protected Inner clone() {
try {
return (Inner) super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
return null;
}
}
}
public class Teste implements Cloneable {
int valor;
Inner inner;
@Override
protected Teste clone() {
try {
Teste clone = (Teste) super.clone();
clone.inner = inner.clone();
return clone;
} catch (CloneNotSupportedException e) {
e.printStackTrace();
return null;
}
}
public static void main(String[] args) {
Teste t = new Teste();
t.valor = 10;
t.inner = new Inner();
t.inner.valor = 10;
Teste clone = t.clone();
clone.valor = 20;
clone.inner.valor = 20;
System.out.println("Valor em t: " + t.valor + " Valor em clone: "
+ clone.valor);
System.out.println("Valor inner em t: " + t.inner.valor
+ " Valor inner em clone: " + clone.inner.valor);
}
}
hum ainda não entendi bem como isso funciona…eu li uma serie de coisas acerca do cloneable e metodos de clone mas não cheguei a perceber porque o meu não dá ou qual é o erro…pois eu tenho o cloneable e o metodo clone() está correcto…