Dynamisch ein Objekt einer bestimmten Subklasse erstellen

Fant

Bekanntes Mitglied
Hallo zusammen..

folgendes Szenario: Ich habe eine Basisklasse von der mehrere andere Klassen erben. Eine bestimmte Methode erwartet ein Objekt der Basisklasse, bekommt aber in der Regel ein Objekt einer der Subklassen übergeben. Ich denke an einem CodeSchnipsel wird deutlicher, was ich möchte, als bei einer ausschweifenden Erklärung:

Java:
public class A {...}
public class B extends A { ... }
public class C extends A { ... }

public class Test {
   private A a;
   public void macheEtwas(A a) {
      // ...
      // hier möchte ich this.a ein neues Objekt vom tatsächlich übergebenen Typ zuweisen.
   }

   public void main(String [] args) {
      a = new B();
      macheEtwas(a);
      // Jetzt soll a ein neues Objekt vom Typ B sein 
      a = new C();
      macheEtwas(a);
      // Jetzt soll a ein neues Objekt vom Typ C sein
}

Ich kann natürlich mit instanceof jeden potentiellen Subtyp abklappern und dann entsprechend ein neues Objekt erstellen. Ich würde das aber ganz gerne allgemeiner halten, wenn das irgendwie geht, da die Liste an Subtypen relativ groß ist und ich nicht ständig diese Methode anpacken möchte, wenn neue hinzu kommen.
Wie kann man das eleganter lösen? (Die Lösung sollte auch noch unter Java 1.5 laufen)

Viele Grüße
Fant
 
G

Gast2

Gast
Falls deine Subklassen alle einen default Konstruktor haben kannst du folgendes machen:

Java:
public class Test {
	private static A a;

	public static void macheEtwas(A a) {
		try {
			Test.a = a.getClass().newInstance();
		} catch (InstantiationException | IllegalAccessException e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
		a = new B();
		System.out.println(a);
		macheEtwas(a);
		System.out.println(a);
	}
}

class A {
}

class B extends A {
}
 
Zuletzt bearbeitet von einem Moderator:

andreT

Aktives Mitglied
Wenn klar ist das ALLE erbenden Klassen solche (auf diesem "unbekannten" Weg) erzeugte Instanzen erzeugen können müssen, sollte man dies auch mit einer abstrakten Methode in A bzw. via einem Interface vorschreiben!
Reflection dient, zumindest für mein Verständnis, eigentlich mehr der Objekt- oder Codeanalyse für Debugger, Generatoren etc.. Irgendwo "auf dunklem Wege" Objekte zu erzeugen ist m.E. ein "So schonmal gar nicht" ;)
 

Fant

Bekanntes Mitglied
Mir ist nicht klar, was du meinst? Die Klassen erzeugen ja keine Instanz von sich selbst, sondern in einer separate Klasse, welche nun eine Instanzvariable der Basisklasse besitzt, möchte ich ein neues Objekt (des aktuellen tatsächlichen Subtyps) erzeugen und eben dieser Instanzvariablen zuordnen.
 
G

Gast2

Gast
andreT meint so was:
Java:
public class Test {
	private static A a;

	public static void macheEtwas(A a) {
		Test.a = a.newInstance();
	}

	public static void main(String[] args) {
		a = new B();
		System.out.println(a);
		macheEtwas(a);
		System.out.println(a);
	}
}

interface Instantiable<T> {
	public T newInstance();
}

abstract class A implements Instantiable<A>{
}

class B extends A {
	@Override
	public A newInstance() {
		return new B();
	}
}
Damit lagerst du die Logik zum erzeugen eines Objekts in die jeweilige Klasse aus und sparst dir Reflection. Hat beides seine Vor- und Nachteile.
 

andreT

Aktives Mitglied
Kommt ja auch immer auf die "Umgebung" an. Für mein kleines Home-Projekt würd ich ggf. auch Reflection benutzen, aber in größeren Projekten ist das nach meiner Erfahrung "nicht so gern gesehen". Schon aus dem Grund daß nicht mal eben alle Stellen der Erzeugung von Objekten von der IDE gefunden werden können. Reflection macht ja keine konkrete Referenz auf den Konstruktor o.ä.! Plötzlich schwirren da unerwartete Objekte im Debugger rum und keiner will's nachher gewesen sein :D
Wie gesagt: Reflection ist schon eine feine Sache, aber um die Fehlersuche und Wartbarkeit des Codes (übrigens auch für die Kollegen/die Nachwelt!!!) leichter zu machen, lieber sowas (siehe Bsp. von EikeB) wie ein Interface benutzen.
 
B

bygones

Gast
Reflection hat nur dann den Vorteil wenn man die abstraktion und implementierung getrennt hat, so dass zur compilezeit sie sich nicht kennen.

ansonsten wuerde ich immer den Interface weg gehen - siehe andreTs Beitrag
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B objekt einer klasse dynamisch erzeugen Allgemeine Java-Themen 6
T Objekt dynamisch neu erstellen/ austauschen Allgemeine Java-Themen 9
G Objekt dynamisch erstellen und Inhalte kopieren Allgemeine Java-Themen 6
berserkerdq2 Jemand einen Tipp wie man ein Javafx-Hintergrund "dynamisch" macht Allgemeine Java-Themen 3
E RMI FWH: RMI- Wie erstelle ich stubs dynamisch, bzw. unterdrücke eine Statisch-Warnung? Allgemeine Java-Themen 0
S Maven Jars dynamisch laden / Plugin-Struktur erstellen Allgemeine Java-Themen 14
T Statisch und dynamisch Allgemeine Java-Themen 1
MiMa Variableninhalte dynamisch abfragen Allgemeine Java-Themen 12
D Methode dynamisch aufrufen Allgemeine Java-Themen 2
S Externe Eclipse Projekte dynamisch einbinden Allgemeine Java-Themen 3
Thallius Externe .jar dynamisch einbinden Allgemeine Java-Themen 5
C Erste Schritte Baumstruktur (dynamisch) Allgemeine Java-Themen 9
F JTree: Nodes dynamisch anlegen via LinkedHashMap Allgemeine Java-Themen 2
B Reflection, invoke dynamisch befüllen Allgemeine Java-Themen 3
M Klassen Klasse Dynamisch laden und Konstruktor aufrufen Allgemeine Java-Themen 1
J rxtxserial.dll für 32 oder 64bit dynamisch einbinden Allgemeine Java-Themen 9
W Dateinamen dynamisch Parsen Allgemeine Java-Themen 12
T Classpath Klassen dynamisch erstellen Allgemeine Java-Themen 4
F Schlüsselworte Einstellungen dynamisch deserialisieren Allgemeine Java-Themen 5
S LaTeX Code in dynamisch erzeugten PDF's Allgemeine Java-Themen 8
X Dynamisch Konstruktor aufrufen Allgemeine Java-Themen 12
hdi Ressourcen dynamisch zur Laufzeit laden Allgemeine Java-Themen 15
A Klassen dynamisch aus jar-datei laden Allgemeine Java-Themen 5
J instanceof vermeiden und stattdessen dynamisch binden Allgemeine Java-Themen 6
M Konstruktoraufruf dynamisch auswerten und SQL bauen Allgemeine Java-Themen 10
E Variable dynamisch ausgeben Allgemeine Java-Themen 5
Tandibur pattern dynamisch vorkompilieren Allgemeine Java-Themen 9
T Dynamisch getypte Klasseninstanz? Allgemeine Java-Themen 6
H getText(); bei dynamisch generierten JTextFiled Allgemeine Java-Themen 2
F Wie erfahre ich dynamisch den namen eines aktuellen Objektes Allgemeine Java-Themen 2
S Asymmetrisches Array dynamisch erzeugen Allgemeine Java-Themen 4
T Objekte dynamisch über eine Methode erzeugen Allgemeine Java-Themen 10
R Object Dynamisch erzeugen (Reflection API) Allgemeine Java-Themen 22
P RTF dynamisch machen (IText, Swing) Allgemeine Java-Themen 4
B Listener dynamisch setzen Allgemeine Java-Themen 6
P Klasse Dynamisch laden und zurückgeben Allgemeine Java-Themen 17
P Array Dynamisch vergrößern Allgemeine Java-Themen 7
C Dynamisch Objekte unterschiedlicher Typen erzeugen Allgemeine Java-Themen 6
D Klassen dynamisch laden Allgemeine Java-Themen 5
E Arrays -> dynamisch Allgemeine Java-Themen 21
K Methoden dynamisch erstellen Allgemeine Java-Themen 12
P Dynamisch casten - möglich? wie? Allgemeine Java-Themen 5
T Klassen dynamisch ausführen Allgemeine Java-Themen 3
N Graphische Oberfläche dynamisch erweitern möglich? Allgemeine Java-Themen 4
B Absolute Paf einer Klasse in dieser dynamisch auslesen? Allgemeine Java-Themen 5
K Klasse dynamisch casten Allgemeine Java-Themen 14
Reeny Dynamisch Klassen kompilieren Allgemeine Java-Themen 5
G JDO Dynamisch ? Allgemeine Java-Themen 2
H Objekte m. versch. Interf. dynamisch erzeugen Allgemeine Java-Themen 11
E Klasse dynamisch über main-Methode aufrufen Allgemeine Java-Themen 9
D Strings dynamisch füllen Allgemeine Java-Themen 5
A Dynamisch Attribute hinzufügen Allgemeine Java-Themen 3
N Lwjgl 3d Objekt wird schmaler, wenn es sich dreht Allgemeine Java-Themen 0
B Ein Objekt einer Klasse mehreren anderen Klassen zur Verfügung stellen? Allgemeine Java-Themen 6
T Objekt Array Aufgabe mit Busdatenbank Allgemeine Java-Themen 2
Maxi-JOO Klassen Dummy Objekt in anderen Constructor übergeben Allgemeine Java-Themen 5
el_niiinho13 Objekt auf der Konsole ausgeben lassen Allgemeine Java-Themen 8
d.lumpi Aus Einer Klasse auf ein Objekt einer anderen Klasse Zugreifen Allgemeine Java-Themen 1
A Objekt aus anderen Objekten machen Allgemeine Java-Themen 8
SaftigMelo In einem Winkel Objekt bewegen Allgemeine Java-Themen 2
E Datentypen Wie kann ich die Längen der unterschiedlichen Ebenen aus einem Objekt lesen von dem ich weiß, dass es ein mehrdimensionaler Array ist? Allgemeine Java-Themen 3
H Objekt speichern und laden Allgemeine Java-Themen 1
H Objekt speichern und laden Allgemeine Java-Themen 1
J Objekt in Bytestream umwandeln Allgemeine Java-Themen 12
J Wie kann ich von Vornherrein einen Fokus auf ein Objekt entfernen? Allgemeine Java-Themen 3
J Information von getSource() Objekt auslesen Allgemeine Java-Themen 1
Drachenbauer Wie stelle ich fest, ob ein Objekt in meinem Array vorkommt? Allgemeine Java-Themen 5
S Variable als Objekt Name Allgemeine Java-Themen 3
D Input/Output Zwischen zwei ID-Räumen unterscheiden und Objekt löschen Allgemeine Java-Themen 16
L Objekt aus Objekt-array "löschen" Allgemeine Java-Themen 2
T Objekt mit String und Int aus TxT Datei erstellen Allgemeine Java-Themen 23
T Objekt in Array packen Allgemeine Java-Themen 6
K Methodenaufruf mit String / String zu Objekt konvertieren Allgemeine Java-Themen 8
S Neues Objekt darstellen Allgemeine Java-Themen 4
J Best Practice Objekt an alle Klassen verteilen ( Discord Bot ) Allgemeine Java-Themen 7
D Objekt-Suche mit mehreren optionalen Parametern Allgemeine Java-Themen 6
M Klassen Objekt weiter geben Allgemeine Java-Themen 1
B Klassen Objekt erzeugen und Konstruktor aufrufen - Welche Lösung ist besser? Allgemeine Java-Themen 2
L Variablen Eigenes Objekt wie z.B. einen Integer zuweisen Allgemeine Java-Themen 3
D Konstruktor - jedes Objekt einzeln erzeugen - alternative? Allgemeine Java-Themen 8
S Applet Überprüfen ob ein Objekt angeklickt wurde Allgemeine Java-Themen 2
RalleYTN 3D Objekt Translation basierend auf Rotation (Probleme mit Z Rotation) Allgemeine Java-Themen 0
B Von String zu <Objekt> ||Speichern/Laden Allgemeine Java-Themen 17
G Neues Objekt aus List<JsonObject> mit Stream Allgemeine Java-Themen 4
P Threads Objekt im Konstruktor anders wie im Run()-Block Allgemeine Java-Themen 10
R Objekt funktioniert nicht auf iOS Allgemeine Java-Themen 15
K Textdatei als Objekt Allgemeine Java-Themen 4
Viktim Classenname zu Objekt Allgemeine Java-Themen 4
P Entity Objekt Methoden vs Service methoden Allgemeine Java-Themen 2
D Datentypen Klassenattribut aus Objekt in generischer Liste Allgemeine Java-Themen 15
O Klassen Bruch im gleichen Objekt Speichern Allgemeine Java-Themen 1
P Liste zu Objekt umwandeln Allgemeine Java-Themen 4
C Liste checken auf MINDESTENS ein Objekt | Bukkit Allgemeine Java-Themen 3
K Best Practice JFrame Objekt allgemein zugänglich machen Allgemeine Java-Themen 8
B ArrayList in ein Objekt legen Allgemeine Java-Themen 1
D Objekt entlang eines Funktionsgraphens bewegen Allgemeine Java-Themen 6
M Objekt serialisieren/deserialisieren und in einer SQLite-Datenbank speichern Allgemeine Java-Themen 3
D Java Objekt als Service in Runtime registrieren Allgemeine Java-Themen 1
S Interaktion mit einer website (website als Objekt?) Allgemeine Java-Themen 3
J OOP Überwachen, ob ein Objekt erzeugt wird Allgemeine Java-Themen 9

Ähnliche Java Themen

Neue Themen


Oben