Início‎ > ‎

Impedir a clonagem dos objetos

O mecanismo de clonagem de objetos em Java permite a criação de objetos de uma classe sem que os construtores desta classe sejam executados. Mesmo que a sua classe não seja declarada clonável (implemente a interface java.lang.Cloneable), um adversário poderia criar uma subclasse e fazer a subclasse implementar a interface java.lang.Cloneable. Isto permitiria criar instâncias da subclasse sem usar um de seus construtores, fazendo cópias das posições de memória onde os objetos estão armazenados. Seria então possível usar esta subclasse no lugar da classe original e usar a operação Clone() em objetos da subclasse. Embora em alguns casos a clonagem seja necessária, em outras situações isto pode ser perigoso.

A melhor alternativa para evitar ter de se preocupar com isso é tornar todas as classes inclonáveis, o que pode ser realizado pela simples implementação do seguinte método em suas classes:

public final void clone() throws java.lang.CloneNotSupportedException {
        throw new java.lang.CloneNotSupportedException();
}

Se, mesmo após examinar as conseqüências, for tomada a decisão de deixar a classe ser clonável, defina o método de clonagem como final. Se estiver usando um método de clonagem definido em uma superclasse, defina o método clone() conforme o exemplo a seguir, para impedir que seja redefinido:

public final void clone() throws java.lang.CloneNotSupportedException{
        super.clone();
}

Note que estes métodos foram declarados como final para evitar que sejam redefinidos em alguma subclasse, conforme o item “Tornar todos os métodos e classes “final””.

Comments