Klasse/Object Eigenaufruf

Network

Top Contributor
Hi,

gibt es eine Möglichkeit, dass Objekte sich selbst nochmal aufrufen? (Um Beispielsweise eine Kopie dieses Objektes zu bekommen)

Mit anderen Worten:
Ich habe 20 verschiedene Klassen die alle von der selben abstract class erben. Ich möchte jetzt eine Kopie eines dieser Objekte erhalten und rufe die Methode "getCopy()" auf:
Java:
public class ZuKopieren1() extends Kopierbar {
     
     private int i;
     
     public ZuKopieren1( int i ) {
          this.i = i;
     }
     @Override
     public void getCopy() {
          return new ZuKopieren1( i );
     }
}

Das Problem ist, ich muss jetzt in allen Klassen, die von Kopierbar erben, manuell in getCopy() den jeweiligen Klassennamen schreiben.
Schön wäre es, wenn ich das verhindern könnte und nur in "Kopierbar" definieren müsste.
Gibt es da irgendeine Möglichkeit?

Ich habe bereits von der Methode clone() gehört, mit der man eine flache Kopie erstellen kann. Bin mir aber nicht sicher, ob sowas wirklich das richtige ist.

Im Grunde habe ich eine Liste bei der man einen Eintrag auswählen kann und bei Klick auf "Erstellen" soll das jeweilige Objekt instanziiert werden. Damit der Eintrag weiss, welches Kind genau instanziiert werden soll, übergebe ich jedem Eintrag das jeweilige Objekt.
Und je schneller das passiert umso besser.

Danke
Gruß
Net
 
Mit "sauberem" Java gibts da auser clone() keine Möglichkeit. Mit Reflections ist es allerdings theoretisch möglich, aber ziemlich umständlich, wenn du etwas anderes als den default Konstruktor oder einen Copy-Konstruktor (Konstruktor, der als einziges Argument ein Objekt der selben Klasse nimmt) aufrufen musst.

Für einen Copy-Konstruktor würde die copy Methode (ohne Exception-Handling) so aussehen:

Java:
public Kopierbar getCopy() {
    return getClass().getConstructor(getClass()).newInstance(this);
}
 
Schön wäre es, wenn ich das verhindern könnte und nur in "Kopierbar" definieren müsste.
Gibt es da irgendeine Möglichkeit?
Ich verstehe nicht ganz den Sinn dahinter? Sicherlich gibt es Möglichkeiten, aber die sind wahrscheinlich allesamt länger als einfach zu schreiben
Code:
new ZuKopierenX()
. Wenn´s dir nur um die Tipparbeit geht: drückst du einfach Strg+Leertaste in deiner IDE und schon kriegst du den Klassennamen...

[EDIT]Mit Reflection könnte das Ganze aber vlcht. tatsächlich einigermaßen elegant ausfallsen, wie mir grad in den Sinn kommt...[/EDIT]
 
da die implementierenden Klassen ja wahrscheinlich unterschiedlich sind in ihren Eigenschaften ist eine generelle Loesung ohne jegliche Implementierung in den Unterklassen nicht moeglich.

Kopierbar ansich klingt auch mehr nach einem Interface als einer abstrakten Klasse. Scheint sich zu verhalten wie Comparable... du kannst nicht generell definieren wie sich ein Unterobjekt sortiert, wenn es eigene Regeln aufstellt.

Und das mit Reflections zu loesen halte ich fuer unsinnig. Vielleicht hilft eine Factory klasse, die dann das besser getrennt und strukturiert anbieten kann ?!
 
Es geht dem TO ja hauptsächlich darum sich Tipparbeit bzw. "redundanten" Code zu sparen. Das ist mit einer Faktory nur teilweise gegeben, auserdem müssten beim Programmieren einer Faktory-Klasse alle ableitenden Klassen bekannt sein. Dass das ganze sehr nach einem potentiellen Konzeptfehler klingt, ist nachvollziehbar.
 
Mit clone() habe ich so meine Angst, weil ich das Ergebniss zu unnachvollziehbar finde. Gerade mit den Referenzen die erhalten bleiben hat man ja dann kein Klon sondern mehr soetwas wie einen siamesischen Zwilling.

Ich versuche es mal etwas anderst darzustellen:
Ich möchte dem Nutzer die Möglichkeiten geben, den Code grob anzupassen per visualisierter Darstellung. Dafür habe ich die abstrakte Klasse "Plugin" mit ein paar standard Methoden, die jedes Plugin ausführen muss, sowie ein paar leeren, die aufgerufen werden in bestimmten Situationen und überschrieben werden dürfen.

Damit der Nutzer das Plugin dem Standardobjekt hinzufügen kann, hatte ich mir einen Editor überlegt, der eine Liste anbietet und bei Klick das Plugin initialisiert und hinzufügt.

Damit das möglich ist muss ich den Listenobjekten irgendwie beibringen, ein ganz bestimmtes Plugin zu initialisieren. Und da dachte ich daran, dass ich ihnen das Hauptobjekt übergebe und davon irgendwie bei Bedarf den Konstruktor aufrufen könnte. Aber anscheinend funktioniert das nicht so.

In der Utopie hatte ich mir vorgestellt:
Java:
public Plugin createNew() {
     return new this();
}

Gruß
Net
 

Zurück
Oben