comportamiento Cloneable
-
28-09-2019 - |
Pregunta
doc dice Java -
La clase Object en sí no lo hace implementar la interfaz Cloneable, por lo llamar al método clon en un objeto cuya clase es objeto dará lugar a lanzar una excepción en tiempo de ejecución.
razón por la cual se protege método clone en la clase de objeto? Es así?
Es decir, cualquier clase, que no implementa cloneable lanzará CloneNotSupported excepción cuando se invoca el método clone.
Me corrió un programa de prueba
public class Test extends ABC implements Cloneable{
@Override
public Object clone() throws CloneNotSupportedException {
System.out.println("calling super.clone");
return super.clone();
}
public static void main(String[] args) {
Test t = new Test();
try{
t.clone();
}
catch (Exception e) {
e.printStackTrace();
}
}
}
class ABC{
}
Desde se invoca super.clone método clone de prueba Clase?
¿Por qué no lanzar una excepción?
Solución
árbol de herencia de las miradas ejemplo Test
t
como
Object
ABC
Test
Test
también implementa Cloneable
lo que significa que cuando se llama método super.clone()
el método de Object
clone
se llamará. Se comprueba si los implementos ejemplo t
la interfaz Cloneable
. Desde que hace poner en práctica el método no lanzar una excepción.
Otros consejos
La interfaz Cloneable es una interfaz de marcador que indica que la clase que implementa soporta el método de clon. La razón de que super.clone () no produce una excepción es que el objeto de base que está siendo llamado en Cloneable es por herencia.
Desde el Javadoc:
implementa la clase A la interfaz Cloneable para indicar al método Object.clone () que es legal para que el método para hacer una copia de campo para el campo de las instancias de esa clase.
método clone de Invocación de objetos en una instancia que no implementa los resultados de interfaz Cloneable en el CloneNotSupportedException excepción siendo lanzada.
Debido a su clase implementa Cloneable
. Desde el Javadoc de Cloneable
:
implementa la clase A la interfaz Cloneable para indicar al método Object.clone () que es legal para que el método para hacer una copia de campo para el campo de las instancias de esa clase.
Así que este método permite el uso de Object
clone()
. Es (de nuevo de acuerdo con el Javadoc) sólo una convención para clone()
anulación. Si no cancelas y método de Object
clone()
realiza una copia de campo-por-campo, es posible que aún así obtener una CloneNotSupportedException
si uno de los campos es en sí misma no cloneable. Por lo tanto es un buen consejo para anularlo.
¿Por qué el método clone en
protected
clase Object?
Para que una clase que elige para apoyar la clonación no es forzó para exponerlo en su API pública.
A medida que su ejemplo demuestra, se permite una subclase para anular un método con un mayor acceso a la versión heredada del método. Simplemente no se puede reducir el acceso de un método de esta manera.
Es decir, cualquier clase, que no implementa cloneable lanzará CloneNotSupported excepción cuando se invoca el método clone.
Eso es correcto.
Desde se invoca super.clone método clone de prueba Clase?
Eso es correcto.
¿Por qué no lanzar una excepción?
Debido a que usted ha declarado que su clase implementa Cloneable
. Si no hubiera hecho esto, le una excepción ... suponiendo que su método clone todavía se llama super.clone()
.
Esto le podría dar la respuesta a por qué se protege el método por qué está protegido método clon
No tirar excepción porque se implementa Cloneable. De la documentación Cloneable:
"implementa la clase A la interfaz Cloneable para indicar al método Object.clone () que es legal para que el método para hacer una copia de campo para el campo de las instancias de esa clase. La invocación de método clone de objetos en una instancia que no implementa ??strong> los resultados de interfaz Cloneable en el CloneNotSupportedException excepción que son lanzados. "
Sin embargo, a medida que va a implementar se le dice a la aplicación del objeto que es legal para hacer una copia de campo para el campo por lo que no lanza la excepción.
Yo diría que una buena pregunta para confundir a los entrevistados:.)
En cuanto a la razón por la que no lanza la excepción. Piense en ello en forma de objetos. Su objeto es t de prueba de clase que implementa Cloneable. Cuando se llama al método super.clone todavía es un objeto de la clase de prueba y por lo tanto no hay razón para que tire CloneNotSupported excepción. Si hubiera sido un objeto de la misma clase de objetos que hubiera tirado la excepción.