Guten Abend allerseits
Ich wickle mir grad Knoten ins Gehirn. Folgendes Problem:
Ich habe eine Klasse erstellt, die, soweit zugänglich, alle Informationen über ein Objekt sammelt und speichert. Hinterher bin ich, wenn alles glatt geht, in der Lage, das Objekt vollständig zu klonen.
Bisher habe ich nur eine Bedingung vorgegeben: es muß ein parameterloser Konstruktor vorhanden sein. Notfalls konnte er auch privat sein.
Jetzt, wo ich die Klasse einsetzen will, fliegt mir dieses Konzept um die Ohren. Ich habe Objekte vom Typ UUID verbaut mit dem Ziel, eine eindeutige Zuordnung zu einem Objekt zu schaffen. Ein solches UUID-Objekt ist an mehreren Orten gespeichert.
Ich habe mal im Quellcode von Gson reingeschaut wie die Objetke instanzieren, und bin über den Umfang erschrocken. Das ist deutlich mehr Code als ich erwartet hätte.
Wenn ich an dieser Stelle darüber nachdenke, könnte es eine fatale Idee sein über private Konstruktoren zu instanzieren. Ich habe z.B. in einer Klasse das Singletonpattern benutzt, da wäre Instanzierung über den privaten Konstruktor eine Katastrophe. Und im Falle der UUID-Klasse hat es garantiert auch seinen Grund, daß das Objekt regulär nur über eine Methode instanziert werden kann. Ich vermute mal einen Konstruktor der ein Long entgegennimmt, wobei vorher noch geprüft wird ob mit diesem Long bereits ein Objekt instanziert wurde. Oder etwas ähnliches, jedenfalls würde mein Konstrukt solche Konzepte aushebeln.
Jetzt ist die Frage: Was tun? Folgende Ideen hätte ich:
Ich wickle mir grad Knoten ins Gehirn. Folgendes Problem:
Ich habe eine Klasse erstellt, die, soweit zugänglich, alle Informationen über ein Objekt sammelt und speichert. Hinterher bin ich, wenn alles glatt geht, in der Lage, das Objekt vollständig zu klonen.
Bisher habe ich nur eine Bedingung vorgegeben: es muß ein parameterloser Konstruktor vorhanden sein. Notfalls konnte er auch privat sein.
Jetzt, wo ich die Klasse einsetzen will, fliegt mir dieses Konzept um die Ohren. Ich habe Objekte vom Typ UUID verbaut mit dem Ziel, eine eindeutige Zuordnung zu einem Objekt zu schaffen. Ein solches UUID-Objekt ist an mehreren Orten gespeichert.
Ich habe mal im Quellcode von Gson reingeschaut wie die Objetke instanzieren, und bin über den Umfang erschrocken. Das ist deutlich mehr Code als ich erwartet hätte.
Wenn ich an dieser Stelle darüber nachdenke, könnte es eine fatale Idee sein über private Konstruktoren zu instanzieren. Ich habe z.B. in einer Klasse das Singletonpattern benutzt, da wäre Instanzierung über den privaten Konstruktor eine Katastrophe. Und im Falle der UUID-Klasse hat es garantiert auch seinen Grund, daß das Objekt regulär nur über eine Methode instanziert werden kann. Ich vermute mal einen Konstruktor der ein Long entgegennimmt, wobei vorher noch geprüft wird ob mit diesem Long bereits ein Objekt instanziert wurde. Oder etwas ähnliches, jedenfalls würde mein Konstrukt solche Konzepte aushebeln.
Jetzt ist die Frage: Was tun? Folgende Ideen hätte ich:
- Wenn kein öffentlicher parameterloser Konstruktor vorhanden ist, dann suche ich mir einen, für dessen Aufruf ich über Feldinformationen verfüge, deren Namen mit denen der Konstruktorparameter übereinstimmen. Beispiel:
Java:public class TheClass{ private int anInt; //Ich weiß, welche Werte diese Variablen mal hatten private short aShort; private short nochAShort; private TheClass(){} // <- meide ich künftig private TheClass(short aShort, short nochAShort){ //Den nehme ich, und rufe diesen mit den beiden Variablenwerten für aShort und nochAShort auf //... } private TheClass(int anInt, int anUnknownInt){ //Keine Information über eine Variable namens anUnknownInt, daher benutze ich diesen Konstruktor nicht //... } }
Allerdings ist das eine recht wacklige Angelegenheit, wie ich finde. Es ist ja keineswegs sichergestellt, daß im Konstruktor nur einthis.member = member;
durchgeführt wird. - Wenn es eine parameterlose statische Methode gibt, die ein solches Objekt zurückliefert, rufe ich die auf. Auf die Ersetzung der Instanzvariablen verzichte ich dann aber lieber.
- Ich könnte dem Benutzer auch eine Schnittstelle für das Instanzieren von Objekten zur Verfügung stellen. Das kann optional sein, aber dann muß ich ja immer noch die Fälle erschlagen für die es diese Option nicht gibt.