Implementierung von clone() für unveränderliche Klassen

Ich bin die Entwicklung einer Klassenbibliothek.

  1. Ich habe eine abstrakte Basisklasse Matrix für Matrizen, bietet Implementierungen für einige der grundlegenden Methoden.
  2. Abgeleitet von Matrix sind konkrete Unterklassen für verschiedene Arten von Matrizen.
  3. Ich habe die Anforderung für Matrizen werden cloneable, so Matrix implementiert das Cloneable-interface.
  4. Einige der Klassen, abgeleitet von Matrix sind unveränderlich

Wäre es akzeptabel für das immutable-Klassen' - Klon-Methoden, anstatt ein Klon des Objekts, wird das Objekt selbst zurückgegeben?

Einige (vereinfachte) code zur Klarstellung:

abstract class Matrix implements Cloneable {
   ...
}

class ImmutableMatrix extends Matrix {
    ImmutableMatrix clone() {
        return this;
    }
    ...
}

class SomeOtherMatrix extends Matrix {
    SomeOtherMatrix clone() {
        SomeOtherMatrix other = super.clone();
        ...
        return other;
    }
    ...
}
  • Warum erlauben es sogar, dass Ihre Objekte geklont werden, die in den ersten Platz?
  • Einige Operationen (wie transposition) können problemlos implementiert werden, indem du ein kleines wrapper um die ursprüngliche matrix und die Berechnung der Werte on-the-fly. Sie können auch reduzieren den Speicherbedarf in einigen Situationen (z.B. Operationen auf große, dünnbesetzte Matrizen). Das funktioniert gut, solange die ursprüngliche matrix ist unveränderlich. Sonst irgendwelche änderungen an der ursprünglichen matrix und haben Nebenwirkungen auf das Ergebnis. Aber habe ich jetzt gelöst durch die Bereitstellung einer getImmutable () - Methode, die für unveränderliche Unterklassen nur gibt das Objekt selbst, während veränderlich Unterklassen Rückkehr eine unveränderliche Kopie. Nicht mehr Klonen.
InformationsquelleAutor Axel | 2012-11-03
Schreibe einen Kommentar