Frage

Die Java-Dokumentation sagt:

A-Klasse implementiert die klonbar Schnittstelle zu dem, um anzuzeigen, Object.clone () Methode ist, dass es Recht für diese Methode, um ein Feld-for-Feld kopieren von Instanzen diese Klasse.

Klon-Methode des Hervorrufen Objekts auf einem Instanz, die nicht implementieren ist die Klonbar Schnittstelle Ergebnisse in der Ausnahme CloneNotSupportedException geworfen.

Nach Konvention Klassen, die Umsetzung diese Schnittstelle überschreiben Object.clone (die geschützt ist) mit eine öffentliche Methode. Siehe Object.clone () Einzelheiten über diese Methode überschrieben.

Beachten Sie, dass diese Schnittstelle nicht enthält die Klon-Methode. Deshalb, es ist nicht möglich, ein Objekt zu klonen lediglich aufgrund der Tatsache, dass es implementiert diese Schnittstelle. Auch wenn die Klon Methode wird aufgerufen reflektiv, gibt es keine Garantie, dass es wird erfolgreich zu sein.

Und ich habe diese UserProfile Klasse:

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);
    }
}

Und zum Testen porpuses, Ich tue dies in main():

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

Bisher Kompilieren keine Probleme / Laufen. Nun pro meinem Verständnis der Dokumentation, implements Cloneable aus der UserProfile Klasse entfernt hat, sollte eine Ausnahme in up1.clone() Anruf werfen, aber es funktioniert nicht.

Ich habe hier gelesen, dass der um klonbar Schnittstelle gebrochen ist, aber ich weiß nicht wirklich, was das bedeutet. Bin ich etwas fehlt?

War es hilfreich?

Lösung

Nun pro meinem Verständnis der Dokumentation, implements Cloneable aus der UserProfile Klasse entfernt hat, sollte in up1.clone() Anruf werfen und Ausnahme, aber es funktioniert nicht.

Solange Ihre Klasse noch eine Implementierung der clone() Methode hat, wird eine Ausnahme natürlich nicht geworfen werden, wenn Sie es nennen -. Es funktioniert wie jede andere Methode, gibt es keine besonderen Zauber beteiligt

Die Umsetzung der clone() in Klasse Object ist, was die Ausnahme auslöst, aber Sie haben außer Kraft gesetzt, dass Verfahren.

Andere Tipps

Es bedeutet, dass, wenn Sie klonbar implementiert und lassen Sie den Klon () -Methode und dann rufen Sie die Methode clone (), wird eine Ausnahme ausgelöst werden.

Bearbeiten : Es ist wahrscheinlich eine Milliarde mal erwähnt zuvor, aber

Verwenden Sie nicht die Methode clone!

Wenn Sie Funktionen benötigen Klonen, anstatt eine Kopie Konstruktor bereitstellen.

Die Schnittstelle wird als gebrochen, weil es Sie nicht zwingen Klon zu implementieren () (die es soll).

Ich bin mit beiden Antworten und Add etwas: Die Schnittstelle ist wie ein ‚Tag‘ zu sagen, dass Ihre Klasse implementiert Klon (). Dass in api-ähnlichen Methoden nützlich ist, wenn Sie nicht den Objekttyp nicht kennen. Dann können Sie schreiben

if (myobj instanceof Cloneable) { dosmthng(); }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top