Hola Raga, has planteado una pregunta bastante interesante, porque es un caso un tanto extraño.
Para responder la pregunta tenemos la información del api de Java sobre esta interface
https://docs.oracle.com/javase/8/docs/api/java/lang/Cloneable.html:
public interface Cloneable
A class implements the Cloneable interface to indicate to the Object.clone() method that it is legal for that method to make a field-for-field copy of instances of that class.
Invoking Object's clone method on an instance that does not implement the Cloneable interface results in the exception CloneNotSupportedException being thrown.
By convention, classes that implement this interface should override Object.clone (which is protected) with a public method. See Object.clone() for details on overriding this method.
Note that this interface does not contain the clone method. Therefore, it is not possible to clone an object merely by virtue of the fact that it implements this interface. Even if the clone method is invoked reflectively, there is no guarantee that it will succeed.
Nos dice estas cosas:
- Implementar la interface cloneable sirve para indicar que invocar el método clone() (heredado de Object) es legal para realizar copias de objetos de esa clase.
- Si se invoca el método clone sobre un objeto que es de una clase que no implementa la interface Cloneable se obtendrá un error CloneNotSupportedException
- Por convención, una clase que implemente esta interface debe sobreescribir el método clone de object (que es un método protected en object) con un método clone con modificador de acceso public.
Y aquí viene lo que sorprende:
- Tener en cuenta que esta inteface no contiene el método clone. Por tanto, no va a ser posible hacer una copia de un objeto simplemente por el hecho de que una clase implemente esta interface. A no ser que el método clone esté sobreescrito correctamente en la clase, la llamada a clone puede provocar resultados indeterminados.
Y como conclusiones podríamos sacar estas:
- Esta interface está vacía (lo cual resulta un poco sorprendente)
- Este es un comportamiento definido por el api de Java distinto al comportamiento habitual (y por ello resulta un tanto confuso).
- Lo correcto para implementar el método clone es implementar la interface y sobreescribir el método clone (a pesar de que implementar la interface no obliga a ello).
¿Por qué no se obliga a sobreescribir el método clone? Esto son detalles del lenguaje que habría que preguntarle a los creadores del lenguaje. Supongo que debe haber algún motivo pero como programadores ya sabemos lo necesario aunque nos quede la duda del por qué han hecho esto así.
Saludos