Ich entwickle eine Klassenbibliothek.Implementieren von clone() für unveränderliche Klassen
- Ich habe eine abstrakte Basisklasse Matrix für Matrizen, die Implementierungen für einige der grundlegenden Methoden bietet.
- Abgeleitet von Matrix sind konkrete Unterklassen für verschiedene Arten von Matrizen.
- Ich habe die Anforderung für Matrizen klonbar sein, so implementiert Matrix die Cloneable-Schnittstelle.
- Einige der von Matrix abgeleiteten Klassen sind unveränderlich
wäre es für die unveränderlichen Klassen Klon Methoden akzeptabel sein, dass stattdessen ein Klon des Objekts zurückzugeben, das Objekt selbst zurückgegeben wird?
Einige (stark vereinfacht) 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 überhaupt erlauben, dass Ihre Objekte geklont werden? –
Einige Operationen (wie Transposition) können einfach implementiert werden, indem ein kleiner Wrapper um die ursprüngliche Matrix zurückgegeben und Werte im laufenden Betrieb berechnet werden. Außerdem können Sie den Speicherbedarf in einigen Situationen reduzieren (d. H. Operationen in großen dünn besetzten Matrizen). Dies funktioniert problemlos, solange die ursprüngliche Matrix unveränderlich ist. Andernfalls würden Änderungen an der ursprünglichen Matrix Nebenwirkungen auf das Ergebnis haben. Aber ich habe es jetzt gelöst, indem ich eine getImmutable() -Methode bereitgestellt habe, die für unveränderliche Unterklassen nur das Objekt selbst zurückgibt, während veränderbare Unterklassen eine unveränderliche Kopie zurückgeben. Kein Klonen mehr. – Axel