Ein Objekt einer Klasse mehreren anderen Klassen zur Verfügung stellen?

berndoa

Top Contributor
Hallo,
ich habe in meinem Java Projekt aktuell folgende Klassenstruktur:
1.png
Details sind im IPrinzip egal, Punkt ist, es gibt sowas wie eine "Wurzelklasse".
Also eine Klasse, von der in der einzigen Main Methode ein Objekt erzeugt wird.
Deren Attribute/"Felder" haben Referenzen auf Objekte von Klassen der "2. Stufe". usw.

Wie im Bild referenziert die oberste (linkeste) Klasse die Wurzel, deren Feldreferenzen zeigen auf Objekte dreier weiterr Klassen.
In jenen Klassenobjekten haben die dortigen Felder wieder Referenzen auf weitere Klassen, usw.
Übrigens gibt es von jeder Klasse nur genau ein Objekt, mehr nicht.
Ist also gewissermassen auch ein Klassenobjekt, wo man sieht welches Objekt welches referenziert.

Nun stehe ich vor dem Grundsätzlichen Problem, das ich die im Bild separat aufgelistete Klasse habe (die die mit Pfeil verbundene Klasse als innere Klasse hat).
Und im großen Baumgebilde oben vereinzelte Klassen Zugriff auf das selbe Objekt dieser bestimmten Klasse haben sollen.

Die lose Klasse liest eine Exceltabelle ein und macht vieles mehr, daher soll nur genau ein Objekt davon erzeugt werden auf das, wer befugt ist, Zugriff haben soll.

Ursprünglich dachte ich, sagen wir mal die Klassen mit Zugriff wären 1,4 und 5 und die sollen zugriff auf ein Objekt der Klasse A haben.

aktuell lasse ich die Wurzel ein Objekt der A Klasse erzeugen und reiche dies geiwssermassen immer weiter nahc unten bis zu den Klassen 1,4 und 5 durch.
Problem halt: Jede Klasse auf dem Weg dahin muss auch erst diese Referenz in Form eines Feldes speichern und dies dann ihrer nächstniedrigeren Klasse übergeben.

Ist keine wirklich schöne Lösung, aber ich hoffe sie funktioniert.
Konnte es, da noch nicht Alles fertig ist, noch nicht ausprobieren.

ist auch mehr so eine "quick and Dirty" Lösung.

Gibt es eine professionelle Möglichkeit, sowas zu lösen?
 

httpdigest

Top Contributor
Mittlerweile ist meine Meinung zur Modellierung von Abhängigkeiten: Mache Abhängigkeiten immer explizit! Also, wenn eine Klasse A in einer ihrer Methoden eine Abhängigkeit auf ein Objekt einer Klasse B hat, dann sollte B ein Konstruktorparameter von A sein.
Die Orchestrierung, also, wer nun tatsächlich die Objekte erzeugt und miteinander "verkabelt" (also die Konstruktoren aufruft) kannst du im Prinzip manuell machen oder hierfür einfach ein Dependency Injection / Container Framework wie Google Guice oder Spring nehmen.
Auf keinen Fall sollte man aber Abhängigkeiten irgendwie "implizit" modellieren durch z.B. irgendwelche public static Variablen, auf die jeder und alles einfach so zugreifen kann.
Also ja: Wenn die Klasse ganz rechts auf dieses geteilte Objekt zugreifen muss, dann musst du es bei der Erzeugung irgendwie vom Anfang bis zu der Klasse ganz rechts durchschleifen.
Im Prinzip machst du dadurch auch ungünstige Modellierungen "sichtbar". Wenn es ein Pain ist, die Abhängigkeiten zu verwalten/durchzuschleifen, dann ist die objektorientierte Modellierung eventuell schlecht.
 

berndoa

Top Contributor
Mittlerweile ist meine Meinung zur Modellierung von Abhängigkeiten: Mache Abhängigkeiten immer explizit! Also, wenn eine Klasse A in einer ihrer Methoden eine Abhängigkeit auf ein Objekt einer Klasse B hat, dann sollte B ein Konstruktorparameter von A sein.
Die Orchestrierung, also, wer nun tatsächlich die Objekte erzeugt und miteinander "verkabelt" (also die Konstruktoren aufruft) kannst du im Prinzip manuell machen oder hierfür einfach ein Dependency Injection / Container Framework wie Google Guice oder Spring nehmen.
Auf keinen Fall sollte man aber Abhängigkeiten irgendwie "implizit" modellieren durch z.B. irgendwelche public static Variablen, auf die jeder und alles einfach so zugreifen kann.
Also ja: Wenn die Klasse ganz rechts auf dieses geteilte Objekt zugreifen muss, dann musst du es bei der Erzeugung irgendwie vom Anfang bis zu der Klasse ganz rechts durchschleifen.
Im Prinzip machst du dadurch auch ungünstige Modellierungen "sichtbar". Wenn es ein Pain ist, die Abhängigkeiten zu verwalten/durchzuschleifen, dann ist die objektorientierte Modellierung eventuell schlecht.
Naja, sagen wir es mal so:
Der Wurzelknoten sei die Klasse A.
Die davon ausgehenden Klassen seien AA,AB,AC,AD.
die von AA ausgehenden seien AAA,AAB,AAC.
die von AB ausgehenden AAA,AAB,AAC.
usw.

halt jetzt einfahc mal durchnummeriert je nach ebene.

Sagen wir die Klasse ABC benötige ein Objekt der Utility Klasse U.
Dann sieht aktuell A bei mir so aus:
Java:
public class A{
    AA aa=new AA();
AB ab=new AB();
AC ac=new AC();
U u=new U();

public A(){

ab.u=this.u;


}

}

Die Klasse AB hat dann ebenso ein eingangs auf null gesetztes U Feld, das wie oben gezeigt gesetzt wird.
Am Ende vom lied kennen dann a und ab das selbe Objekt u.

Genauso erzeugt ab die damit verbundenen Klassenobjekte aba,abb,abc.
und setzt in seinem Konstruktor
Code:
abc.u=this.u;

Wobei mir gerade klar wird dass das vermutlich scheitert weil der eine Konstruktor noch nicht fertig ist während der andere schon gesetzt werden soll. oder so.


das objekt von oben nahc unten als konstruktorparameter immer weiter zu reichen wäre auch eine Option, ggbfls.

Bin mi noch unklar wie man es am Besten macht ohne dass es probleme gibt


Vermutlich könnte man Alles ganz viel anders machen, aber so meine "Objekthierarchie" im Sinne obigen Baumes will ich schon beibehalten.
Weil ich dann in der A klasse dann bspw. eine Methode malen haben kann, die bestimmte Methoden der dmait verbundenen Objekte aufruft.

So im Sinne von einem Big Boss, der eine Aufgabe zu erledigen hat und diese nahc unten an die besser qualifizierten Spezialisten weiterreicht.
Und wenn bspw. der Ingeniuer den Befehl "bau ein Auto" kriegt, weiß er dann genau dass er vom Werkzeughersteller die Klasse "liefereWerkzeug() aufrufen muss, dann vom wem anders dessen spezielle methode, etc.

von oben nach unten ruft also eine allgemein methode immer speziellere Methoden der speziellisierteren unterklassen auf.

So irgendwie.

Dann weiß eine spezielle klasse bspw. genau wie es eine Farbe vom bildschirm einliest.
Die nächsthöhere Klasse. die den befehl "gib mir die bildschirmfarbe bei x,y" runtergegeben hat, muss aber nicht wissen wies geht, die untekrlasse ist da spezialisiert genug um auf anhieb zu wissen was es mit dem befehl machen muss und wie er umzusetzen ist.


Halt das zerlegung von großen aufgaben in mehrere kleinere über eine klassenhierarchie umgesetzt.
 

httpdigest

Top Contributor
Abhängigkeiten einer Klasse sollten nicht einfach von außen als Feld auf ihr gesetzt werden, sondern einzig und alleine über den Konstruktor als Konstruktorparameter übergeben werden.
Was du machst, also die Klasse A einfach in die Klasse AB "hineingreifen" lassen und in ihr ein Feld setzen, ist schonmal ein Anti-Pattern.
Natürlich bekommst du hierdurch zusammen mit der implizitien Feldinitialisierung Probleme in der Reihenfolge.

Also: Nutze einzig und alleine Konstruktorparameter, um Abhängigkeiten von A nach AB zu transportieren. Kein Setzen von Feldern durch Klassen hinweg (also in deinem Fall von AB.u via A).

In dem Fall kannst du dann natürlich nicht einfach implizite Feldinitialisierungen benutzen, sondern deine Klasse A würde wie folgt aussehen:

Java:
public class A {
  private final AA aa;
  private final AB ab;
  private final AC ac;
  private final U u;
 
  public A() {
    u = new U();
    aa = new AA();
    ab = new AB(u);
    ac = new AC();
  }
}

Und AB seinerseits nutzt den Konstruktorparameter u, um seinerseits Instanzen zu erzeugen und u weiterzugeben (wo erforderlich).
 
Zuletzt bearbeitet:

berndoa

Top Contributor
Abhängigkeiten einer Klasse sollten nicht einfach von außen als Feld auf ihr gesetzt werden, sondern einzig und alleine über den Konstruktor als Konstruktorparameter übergeben werden.
Was du machst, also die Klasse A einfach in die Klasse AB "hineingreifen" lassen und in ihr ein Feld setzen, ist schonmal ein Anti-Pattern.
Natürlich bekommst du hierdurch zusammen mit der implizitien Feldinitialisierung Probleme in der Reihenfolge.

Also: Nutze einzig und alleine Konstruktorparameter, um Abhängigkeiten von A nach AB zu transportieren. Kein Setzen von Feldern durch Klassen hinweg (also in deinem Fall von AB.u via A).

In dem Fall kannst du dann natürlich nicht einfach implizite Feldinitialisierungen benutzen, sondern deine Klasse A würde wie folgt aussehen:

Java:
public class A {
  private final AA aa;
  private final AB ab;
  private final AC ac;
  private final U u;
 
  public A() {
    u = new U();
    aa = new AA();
    ab = new AB(u);
    ac = new AC();
  }
}

Und AB seinerseits nutzt den Konstruktorparameter u, um seinerseits Instanzen zu erzeugen und u weiterzugeben (wo erforderlich).
Das hieße, AB sähe dann in etwa so aus?
Java:
public class AB{
    private final ABC abc;
    public AB(U u){
        abc=new ABC(u);
    }
    
}

Kann ich das so einfach "durchreichen" ohne dass AB selbst auch als Feld die u referenz abspeichert?

Was ich mir auch nie sicher bin:
Sagen wir AB hat den Code wie oben.
Wenn nun in A (oder anderswo) ein neues Objekt der Klasse AB erzeugt wird,
werden dann erst die Felder des Objekts erzeugt (sowie die Methoden hinterlegt) und dann erst der ganze Kram im Konstruktor gemacht?
Wiel muss ja eigentlich, sosnt macht es nicht viel Sinn.
 

httpdigest

Top Contributor
Das hieße, AB sähe dann in etwa so aus?
Java:
public class AB{
    private final ABC abc;
    public AB(U u){
        abc=new ABC(u);
    }
}
Korrekt.
Kann ich das so einfach "durchreichen" ohne dass AB selbst auch als Feld die u referenz abspeichert?
Wenn die Klasse AB selbst kein U braucht innerhalb seiner eigenen Methoden, klar. Dann kannst du das einfach durchreichen an ABC. Warum solltest du dann U als Feld innerhalb von AB selbst speichern?
 

temi

Top Contributor
Das hieße, AB sähe dann in etwa so aus?
Java:
public class AB{
private final ABC abc;
public AB(U u){
abc=new ABC(u);
}

}
Kann ich das so einfach "durchreichen" ohne dass AB selbst auch als Feld die u referenz abspeichert?
Ich würde sagen eher so:
Java:
public class AB{
    private final ABC abc;
  
    public AB(ABC abc){
        this.abc = abc;
    }
  
}
Wenn ABC eine Abhängigkeit von U hat, dann wird diese bei der Erzeugung von ABC angegeben. AB muss davon nichts wissen. Falls ein Zugriff auf das U von ABC notwendig ist, dann kann ABC einen getter dafür bereit stellen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
d.lumpi Aus Einer Klasse auf ein Objekt einer anderen Klasse Zugreifen Allgemeine Java-Themen 1
P Objekt einer Klasse erzeugen, die als String vorliegt Allgemeine Java-Themen 3
multiholle Objekt einer Klasse anhand eines String erzeugen Allgemeine Java-Themen 3
G Objekt einer inneren Klasse als Listener Allgemeine Java-Themen 3
V Aus String -> Objekt einer Klasse erzeugen Allgemeine Java-Themen 7
B objekt einer klasse dynamisch erzeugen Allgemeine Java-Themen 6
V Objekt einer Klasse, deren Name nur als String vorhanden Allgemeine Java-Themen 4
K Testen einer Klasse mit File Objekt als Parameter Allgemeine Java-Themen 6
M Objekt serialisieren/deserialisieren und in einer SQLite-Datenbank speichern Allgemeine Java-Themen 3
S Interaktion mit einer website (website als Objekt?) Allgemeine Java-Themen 3
H JavaFX Von einer Methode auf stage-Objekt zugreifen Allgemeine Java-Themen 3
F Dynamisch ein Objekt einer bestimmten Subklasse erstellen Allgemeine Java-Themen 7
F Objekt einer Datei verschieben, aber Verzeichnispfad fehlt Allgemeine Java-Themen 6
K Objekt einer konkreten Implementierung eines Interfaces durch übergebenen String Allgemeine Java-Themen 2
A Iterationen einer XML-Datei in einem Objekt sichern Allgemeine Java-Themen 5
P Serialisiertes Objekt innerhalb einer XML Node Allgemeine Java-Themen 25
L Zugriff auf Objekt das sich in einer Liste befindet Allgemeine Java-Themen 2
N Lwjgl 3d Objekt wird schmaler, wenn es sich dreht Allgemeine Java-Themen 0
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
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
D Java Objekt als Service in Runtime registrieren Allgemeine Java-Themen 1
J OOP Überwachen, ob ein Objekt erzeugt wird Allgemeine Java-Themen 9
S Byte Array welches in Laufzeit aufgelöst wird // Objekt Array Allgemeine Java-Themen 3
Thallius Hash über serialisiertes Objekt? Allgemeine Java-Themen 3
Developer_X Input/Output Serialisiertes Objekt speichern und laden Allgemeine Java-Themen 1
C Generics Objekt in ArrayList Allgemeine Java-Themen 2
L Klassen Konstruktor soll Objekt anderer Klasse erzeugen Allgemeine Java-Themen 2
F Neues Objekt aus .CSV definition Allgemeine Java-Themen 3
K Methoden Objekt wird nicht erkannt Allgemeine Java-Themen 11
P Objekt mit verschiedenen Datentypen Allgemeine Java-Themen 5
T Objekt kontaktiert seinen "erzeuger" Allgemeine Java-Themen 5
S Objekt orientierte Programmierung Allgemeine Java-Themen 7
C Objekt Datenverlust nach Methodenaufruf Allgemeine Java-Themen 9
T WeakReference/PhantomReference: Mitbekommen WELCHES Objekt nun GC'ed wird Allgemeine Java-Themen 2
T Class-Objekt mit URLClassloader Allgemeine Java-Themen 7
P Konsoleneingabe übernehmen und Objekt instanzieren. Allgemeine Java-Themen 5
E Auf Java-Objekt aus anderer Instanz zugreifen Allgemeine Java-Themen 26
L Klassen Polymorphie:2 Attribute gleichen Namens in einem Objekt Allgemeine Java-Themen 6
P Objekt Array in Datei Speichern Allgemeine Java-Themen 3
D Player Objekt - Frame über Server anzeigen lassen. Allgemeine Java-Themen 3
V Objekt löschen Allgemeine Java-Themen 7
A OOP Wie auf Objekt der Superklasse zugreifen? Allgemeine Java-Themen 6
S Datei in File-Objekt mit UTF-8 einlesen Allgemeine Java-Themen 2
M neues Objekt speichern, nicht Referenz Allgemeine Java-Themen 10
B synchronisierter zugriff auf Objekt Allgemeine Java-Themen 6
C Objekt Typ herausfinden Allgemeine Java-Themen 5
E Objekt beim Erzeugen in ArrayList Allgemeine Java-Themen 9
M Objekt prüfen auf null ->Invocation Target Exception??? Allgemeine Java-Themen 2
M Objekt aus Liste in Liste suchen/löschen Allgemeine Java-Themen 6
D Eigenen Objekt Pool Allgemeine Java-Themen 15
C blueJ: Objekt wird nicht in Objektleiste angezeigt Allgemeine Java-Themen 8
T Objekt 2x deserialisieren, aber nur 1x im Heap haben? Allgemeine Java-Themen 4
sambalmueslie Benachrichtigung bei neuer Objekt-Instanz Allgemeine Java-Themen 5
U Konstante in Objekt definieren Allgemeine Java-Themen 6
D this mit Objekt überschreiben Allgemeine Java-Themen 17
R Synchronized - auf welchem Objekt Allgemeine Java-Themen 16
E Objekt erstellen Allgemeine Java-Themen 7
M Timer von nicht existiertem Objekt stopen Allgemeine Java-Themen 5
M Swing-Frontend abhängig von ausgewähltem Objekt Allgemeine Java-Themen 4
J Lebt das Objekt noch?? Allgemeine Java-Themen 12
K Objekt-Austausch zwischen zwei Programmen über System-Clipboard Allgemeine Java-Themen 5

Ähnliche Java Themen

Neue Themen


Oben