Geralmente encontramos 4 problemas consecutivos ao usar esse método em tipos personalizados.
O código básico é o seguinte:
class A {
int[] a = {1,2,3};
}
public class Test {
public static void main(String[] args) {
}
}
Primeiro:
A razão do erro quando o chamamos diretamente é que o método clone na classe Object está protegido e precisa ser reescrito.
o segundo:
A razão pela qual relatamos um erro após a reescrita é que o método clone pode lançar uma exceção CloneNotSupportedException e é uma exceção verificada, portanto, precisamos tratá-la.
O terceiro:
Depois de tratarmos a exceção CloneNotSupportedException acima, haverá uma nova exceção. O motivo é porque o tipo de objeto retornado pelo clone precisa ser forçado.
o quarto:
Depois que todos os problemas acima forem resolvidos, à primeira vista parece estar tudo bem, mas quando o executamos, um erro será relatado novamente. Diz que esta classe não suporta clonagem.
A solução neste momento é deixar a classe clonada implementar a interface Cloneable e pronto.
Nota: O método clone() tem como padrão cópia superficial.