Objekte reproduzieren

Diskutiere Objekte reproduzieren im Allgemeine Java-Themen Bereich.
W

White_Fox

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:
  • 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 ein this.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.
Habt ihr irgendwelche Ideen? Vorschläge? Was würdet ihr tun?
 
H

httpdigest

Andere Frameworks, wie etwa Objenesis, oder auch Java Serialization, erzeugen Objekte, ohne einen Konstruktor aufzurufen. Welche Strategien es hierbei für unterschiedliche JVMs gibt, siehe in den Quellen von Objenesis: https://github.com/easymock/objenesis/tree/master/main/src/main/java/org/objenesis/instantiator
Dich wird vermutlich dieser Fall interessieren: https://github.com/easymock/objenesis/tree/master/main/src/main/java/org/objenesis/instantiator/sun
Somit reicht es dann auch aus, nur noch die Instanzfelder zu initialisieren/schreiben.
 
Thema: 

Objekte reproduzieren

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben