Professional Documents
Culture Documents
cualquierObjeto.cualquierMetodo(miObjetoImportante.clone());
Al igual que en muchos lenguajes orientados-a-objeto, en Java los objetos son pasados por
referencia. Esto implica que cualquier acción tomada por el método “llamado” afectará el
objeto que tiene el método “que llamó”, esto debido a que ambos objetos son el mismo.
Este enfoque no es suficientemente bueno para algunos casos, ya que en general los objetos
no están compuestos solamente de tipos primitivos. String, Hashtable, Vector y otras
clases que residen en el objeto a ser clonado, necesitan a su vez ser clonados, para que el
proceso de clonación sea efectivo, esto es el que se conoce como clonación “profunda”
(‘deep cloning’). A continuación un ejemplo de esto:
import java.util.Hashtable;
import java.util.Vector;
A pesar que la clonación puede ser necesaria, tambien existen situaciones (usualmente de
seguridad) donde se desea prohibir la clonación de una clase, para esto existen varias
alternativas, de las cuales las dos más importantes son:
• Declarar la clase como final. Haciendo esto se previene que se puedan definir
subclases para esta clase, e impedir que cualquiera pueda llamar al método clone
desde dentro de la clase (usando el alcance protected). Si se usa esta alternativa
para impedir la clonación se debe verificar que ninguna de las superclases se pueda
clonar. En el caso que esto sea asi, se debe sobreescribir el método clone en la clase
final y arrojar una CloneNotSupportedException. A pesar que esta es la
alternativa efectivamente impide la clonación, establece restricciones acerca de las
capacidades de extender la clase, las cuales pueden no ser aceptable.
• Implementar Cloneable y sobreescribir el método clone con un alcance public, y
hacer que arroje una CloneNotSupportedException. A pesar que esto impide que
la clase sea clonada, cualquier subclase puede hacer su propia implementación del
método clone e implementar la clonación copiando los atributos uno por uno.
Existe otra forma (considerada como “oscura”) de clonar un objeto, que es la serialización
(‘serializing’) del objeto. La serialización usa un método nativo externo al objeto, es
similiar a la clonación en el sentido en que el estado binario del objeto es capturado desde
memoria, pero en vez de copiarlo hacia otra dirección de memoria es copiado hacia un
‘stream’. En un futuro post pienso conversar un poco acerca de la serialización.