2012-02-06 7 views
7
import java.util.*; 
import java.lang.*; 

public class Test{ 
    public static void main(String[] argv){ 
     String s1="abc"; 
     String s2=(String) s1.clone(); 
    }  
} 

¿Por qué este sencillo programa de prueba no funciona?Clonar() en java

+6

¿De qué manera no funciona? – Jivings

+0

Excepción en el hilo "principal" java.lang.RuntimeException: código fuente no disponible - excepción no reportada java.lang.CloneNotSupportedException; debe ser capturado o declarado lanzado \t en test.Test.main (Test.java:9) Resultado Java: 1 – user1192813

Respuesta

19

clone es un método de la clase Object. Para que una clase sea "clonable", debe implementar la interfaz del marcador Cloneable. La clase String no implementa esta interfaz y no anula el método de clonación, por lo tanto, el error.

espero que el fragmento anterior es para fines educativos, ya que nunca debe sentir una necesidad de llamar clone en cadenas en Java, dado que:

  1. cadenas en Java son inmutables. Siéntase libre de compartirlos en los métodos/clases
  2. Ya existe un constructor new String(String) que actúa como un constructor de copia y es prácticamente equivalente a su llamada clone().
+2

Elemento Java eficaz 11: Anular el clon juiciosamente. (O mejor aún, solo use copiadores y similares que no sean clonar). –

+0

Heh, voto a favor de esta publicación, vaya figura. –

+1

No compila. 'clone' no es un método público en' Cloneable', por lo que su implementación no importaría. –

6

Object.clone() está protegido. Es una API difícil de usar.

Por lo general, uno expone clone() cuando se amplía el objeto ampliando la visibilidad del método.

El clon en cualquier cadena tiene poco significado, ya que es final y inmutables.

Hay una razón para copiar una cadena; eso se puede hacer con:

String s1 = ...; 
String s2 = new String(s1) 
+1

Es raro que necesite copiar una cadena, y no ha explicado por qué lo haría ([esta pregunta] (http://stackoverflow.com/questions/390703/what-is-the-purpose-of-the-expression -new-string-in-java) lo hace). –

1

clone() es un método protegido en la clase Object. Si desea que una clase sea clonable, el patrón general es implementar Cloneable y hacer que ese método sea público.

1

Obviamente no se pudo compilar. Object.clone tiene acceso protegido.

Más allá de ser accesibles dentro de la clase en sí y para codificar dentro del mismo paquete ..., un miembro protegido también se puede acceder desde una clase a través de referencias a objetos que son de al menos el mismo tipo como la clase

1

el java.lang.Cloneable interfaz deben ser implementadas por la clase cuyo clon objeto que queremos crear. Si no lo hacemos, implementa Interfaz clonable, el método clone() genera CloneNotSupportedException.

El método clone() se define en la clase Object. Sintaxis del método clone() es como sigue:

protected Object clone() throws CloneNotSupportedException 
0

Para una clase para ser "cloneable" se debe implementar la interfaz Cloneable marcador. La clase de cadena no implementa esta interfaz y no anula el método de clonación, por lo tanto, el error.

protected Object clone() throws CloneNotSupportedException crea y devuelve la copia exacta (clon) de este objeto.

Las cadenas en Java son inmutables. Siéntase libre de compartirlos en los métodos/clases Ya existe un constructor nuevo String (String) que actúa como un constructor de copia y es prácticamente equivalente a su llamada clone().

Por lo general, uno expone clone() cuando se extiende Object ampliando la visibilidad del método.

El clon en cualquier cuerda tiene poco significado, ya que es tanto definitivo como inmutable.