Pregunta

La documentación de Java dice:

implementa la clase

A la Cloneable interfaz para indicar a la Object.clone () que es legal para que el método para hacer una campo-por-campo copia de las instancias de esa clase.

método clone de Invocación de objetos en una instancia que no implementa la resultados de interfaz Cloneable en el CloneNotSupportedException excepción de ser lanzado.

Por convención, las clases que implementan esta interfaz debe anular Object.clone (que está protegido) con un método público. Ver Object.clone () para obtener más información sobre la sustitución de este método.

Tenga en cuenta que esta interfaz no lo hace contener el método clon. Por lo tanto, no es posible clonar un objeto simplemente en virtud del hecho de que se implementa esta interfaz. Incluso si los método clon se invoca reflexivamente, no hay garantía de que así será tener éxito.

Y tengo esta clase UserProfile:

public class UserProfile implements Cloneable {
    private String name;
    private int ssn;
    private String address;

    public UserProfile(String name, int ssn, String address) {
        this.name = name;
        this.ssn = ssn;
        this.address = address;
    }

    public UserProfile(UserProfile user) {
        this.name = user.getName();
        this.ssn = user.getSSN();
        this.address = user.getAddress();
    }

    // get methods here...

    @Override
    public UserProfile clone() {
        return new UserProfile(this);
    }
}

Y para probar porpuses, hago esto en main():

UserProfile up1 = new UserProfile("User", 123, "Street");
UserProfile up2 = up1.clone();

Hasta el momento, no hay problemas de compilación / ejecución. Ahora, por mi comprensión de la documentación, la eliminación de la clase implements Cloneable UserProfile debe lanzar una excepción en la llamada up1.clone(), pero no lo hace.

He leído por aquí que la interfaz Cloneable se rompe pero no se sabe muy bien lo que eso significa. Me estoy perdiendo algo?

¿Fue útil?

Solución

Ahora, por mi comprensión de la documentación, la eliminación de la clase implements Cloneable UserProfile debe lanzar y excepción en up1.clone() llamada, pero no lo hace.

Mientras su clase todavía tiene una implementación del método clone(), será una excepción por supuesto no se produce cuando se llama a ella -. Funciona igual que cualquier otro método, no hay magia especial involucrada

La implementación de clone() en Object clase es lo que produce la excepción, pero ha anulado ese método.

Otros consejos

Esto significa que si se implementa Cloneable y omite el método clone () y luego llamar al método clone (), se lanzará una excepción.

Editar : Se ha mencionado probablemente 1 mil millones de veces antes, pero

No utilice el método clone!

Si necesita una funcionalidad de clonación, proporcionar un constructor de copia en su lugar.

La interfaz se llama roto porque no le obliga a poner en práctica clone () (que debería).

Estoy de acuerdo con las dos respuestas y añadir algo: la interfaz es como una 'etiqueta' para decir que su clase implementa clone (). Que es útil en api-como métodos cuando no se conoce el tipo de objeto. A continuación, puede escribir

if (myobj instanceof Cloneable) { dosmthng(); }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top