ArrayList`s in Klassen mit Getter/Setter

F

Fohnbit

Top Contributor
Guten Abend,

wie fügt man richtig ein ArrayList Item hinzu, wenn diese in einer weiteren Klasse liegt?

Beispiel:
Java:
class Demo {
    private SubDemo subdemo;
}

class SubDemo {
    private ArrayList<Modul> modul;
}

class Modul {
    private String name;
}

Java:
class Main {
    private Demo demo as New Demo();
}

Wie müssen die getter/setter in der Demo und Subdemo aussehen, wenn ich diese über die class main füllen möchte?

Danke!
 
mihe7

mihe7

Top Contributor
wie fügt man richtig ein ArrayList Item hinzu, wenn diese in einer weiteren Klasse liegt?
Über die weitere Klasse.

Java:
class Demo {
    private SubDemo subdemo;

    public Demo(SubDemo sub) { subdemo = sub; }
}

class SubDemo {
    private ArrayList<Modul> module;

    public void add(Modul modul) { module.add(modul); }
}

class Modul {
    private String name;
}

Java:
SubDemo sd = new SubDemo();
sd.add(new Modul());
sd.add(new Modul());
sd.add(new Modul());

Demo demo = new Demo(sd);
 
F

Fohnbit

Top Contributor
Guten Morgen,

Danke ... aber in der Demo Klasse kann ich den Konstruktor nicht nutzen, da ich mehrere solcher Verschachtelungen habe und erst irgendwann befült werden.

Ich müsste ja demnach in der Demo Klasse die Getter/Setter für die Modul Klasse erzeugen?:
Java:
class Demo {
    private SubDemo subdemo = new SubDemo();

    public void addModul(Modul modul) {
            subdemo.add(modul);
    }
}

class SubDemo {
    private ArrayList<Modul> module = new ArrayList<Modul>;

    public void addModul(Modul modul) {
        module.add(modul);
    }
}

class Modul {
    private String name;
}

Ist das so richtig?

Oder soll man die immer die komplette SubKlasse mit eimem Setter setzen? Hört sich aber nach Performance Verschwendung an, aber man würde immer über den "subdemo getter/setter" arbeiten:

Java:
class Demo {
    private SubDemo subdemo = new SubDemo();
    
    public void addModul(Modul modul) {
        SubDemo tmpSubDemo = subdemo;
        tmpSubDemo.add(modul);
        setSubdemo(tmpSubDemo);
    }
    
    public void setSubdemo(SubDemo subDemo) {
        this.subDemo = subDemo;
    }
    
}

class SubDemo {
    private ArrayList<Modul> module = new ArrayList<Modul>;
    
    public void addModul(Modul modul) {
        module.add(modul);
    }
}

class Modul {
    private String name;
}
 
kneitzel

kneitzel

Top Contributor
Die Idee im ersten Part scheint korrekt. (Außer ein Tippfehler. Wenn die Methode addModule heisst, dann musst Du natürlich auch addModule aufrufen und nicht add.

Die Zweite Idee funktioniert technisch. Aber die Logik ist falsch: Wenn Du eine neue Liste erzeugst und da das Element hinzu fügst, dann dann wäre es kein addModul sondern eine setModule Methode. Und da nur ein Modul zu nehmen scheint auch nicht korrekt - da wäre dann evtl. ein varargs Parameter sinnvolle und dann ein Aufruf von addAll und als Parameter ein Arrays.toList Aufruf mit dem Parameter der Methode um aus dem Array eine Collection zu machen.
 
F

Fohnbit

Top Contributor
Hallo,

danke ... den Tippfehler hab ich gerade gesehen.

Das heißt aber ich muss auch neben dem "add", mindestens ein "remove" und "clear" erstellen. Und das für jedes ArrayList Element in Demo.
Bisserl aufwendig :)

Ich könnte ja die Variable "subDemo" auf Public setzen ... dann bräuchte ich gar keine Methoden, aber leider muss ich mit "PropertyChangeSupport" mich informieren lassen, wenn eine Variable geändert wird. Das geht dann ja nimmer, oder?

Konkret mit einer ArrayList als private Variable:

Java:
public class Product {
    private transient final PropertyChangeSupport pcs = new PropertyChangeSupport(this);

    public void addPropertyChangeListener(PropertyChangeListener listener) {
        this.pcs.addPropertyChangeListener(listener);
    }

    public void removePropertyChangeListener(PropertyChangeListener listener) {
        this.pcs.removePropertyChangeListener(listener);
    }
    
        private ArrayList<OtherImage> otherImages = new ArrayList<OtherImage>();
    
    
    /**
     * @return the otherImages
     */
    public ArrayList<OtherImage> getOtherImages() {
        return otherImages;
    }

    /**
     * @param the otherImages to set
     */
    public void setOtherImages(ArrayList<OtherImage> otherImages) {
        this.pcs.firePropertyChange("otherimage", this.otherImages, otherImages);
        this.otherImages = otherImages;
    }
    
    
    /**
     * @param the otherImage to add
     */
    public void addOtherImage(OtherImage otherImage) {
        this.pcs.firePropertyChange("otherimage", null, otherImage);
        this.otherImages.add(otherImage);
    }

    /**
     * @param the otherImage to remove
     */
    public void removeOtherImage(OtherImage otherImage) {
        this.pcs.firePropertyChange("otherimage", null, null);
        this.otherImages.remove(otherImage);
    }

    /**
     * clear the OtherImages
     */
    public void clearOtherImages() {
        this.pcs.firePropertyChange("otherimage", null, null);
        this.otherImages.clear();
    }
    
}

Wäre schön wenn man Eclipse sagen könnte, es soll die getter/setter so erstellen, wenn man ein ArrayList hat :cool:
 
kneitzel

kneitzel

Top Contributor
Das heißt aber ich muss auch neben dem "add", mindestens ein "remove" und "clear" erstellen. Und das für jedes ArrayList Element in Demo.
Bisserl aufwendig :)

Also wenn Du mehrere Instanzvariablen hast, dann brauchst du mehrere von diesen "Settern/Gettern". Das ist richtig.
Welche Du aber genau brauchst hängt immer von der Logik ab. So remove und clear benötigt werden, dann ist das natürlich auch notwendig.

Ich könnte ja die Variable "subDemo" auf Public setzen ... dann bräuchte ich gar keine Methoden, aber leider muss ich mit "PropertyChangeSupport" mich informieren lassen, wenn eine Variable geändert wird. Das geht dann ja nimmer, oder?

Technisch ginge das, aber das ist ein schlechtes Design:
Implementierungsdetails sind nicht mehr gekapselt, d.h. Du kannst da nichts mehr ändern ohne auch andere Klassen anpacken zu müssen. So solltest Du Dir auch den Setter, der eine ArrayList bekommt, noch mal überlegen. Da würde ich mindestens auf List wechseln, wenn nicht auf Collection. Oder die einfache varargs Variante ...
Und dann ist es aus meiner Sicht üblich, dass man so eine Collection nicht einfach übernimmt. Statt dessen wird die ArrayList geleert oder eine neue erzeugt und dann werden alle Elemente der übergebenen Liste einmal eingefügt.
Ebenso der Getter. Der sollte dann mindestens nur eine List<...> zurück geben.
=> Du kannst dann jederzeit die Klasse ändern und statt einer ArrayList irgend was anderes verwenden. Die ArrayList sollte nach außen nie auftreten.

Ebenso sollte man sich immer überlegen, was man an Methoden braucht. Für vieles gibt es keine Getter und Setter. Du kannst ein Auto beladen und dazu dann halt den Gegenstand und Ort angeben. Also z.B. sowas wie auto.belade(sonnenbrille, HANDSCHUHFACH) aber du machst nie ein handschuhfach = new Handschuhfach(); handschuhfach.insert(Sonnenbrille); auto.setHandschuhfach(handschuhfach);, denn Handschuhfach ist ja ein Implementierungsdetail vom Auto. Das kennst Du nicht. Das ist ein Implementierungsdetail, das der Hersteller kapselt.

Daher aufpassen, was Du wo implementierst. Ein addModule das so über mehrere Klassen geht ist möglich und kann durchaus Sinn machen. Aber es "riecht" und ich würde kritisch auf das Design schauen. (Aber sehr gut möglich, dass es bei Dir eben genau so benötigt wird.)
 
mihe7

mihe7

Top Contributor
Ist das so richtig?
Das ist nicht grds. falsch :) Allerdings sollte man es vermeiden, in der Klasse Objekte zu erstellen, die kein Implementierungsdetail (Collections usw.) darstellen.

Dein Product erstellt eine ArrayList, das ist in Ordnung. Dein Demo erstellt ein SubDemo - damit legst Du in Demo bereits fest, welche Implementierung von SubDemo verwendet werden soll. Nicht so gut.
 
L

LimDul

Top Contributor
Ebenso sollte man sich immer überlegen, was man an Methoden braucht. Für vieles gibt es keine Getter und Setter. Du kannst ein Auto beladen und dazu dann halt den Gegenstand und Ort angeben. Also z.B. sowas wie auto.belade(sonnenbrille, HANDSCHUHFACH) aber du machst nie ein handschuhfach = new Handschuhfach(); handschuhfach.insert(Sonnenbrille); auto.setHandschuhfach(handschuhfach);, denn Handschuhfach ist ja ein Implementierungsdetail vom Auto. Das kennst Du nicht. Das ist ein Implementierungsdetail, das der Hersteller kapselt.

Das würde ich noch mal unterstreichen. Ich verstehe, dass man am Anfang sehr viel Daten & Technikgetrieben ist (Ich hab ein Attribut X, auf das andere "zugreifen" sollen bzw. es bearbeiten können.

Aber in Wirklichkeit hast du in der Klasse kein Attribut X, sondern du hast eine Fachlichkeit, die die Klasse abbildet - und diese Fachlichkeit benötigt als Implementierungsdetail vielleicht ein Attribut X. Deswegen ist ein sinnvolles Vorgehen sich folgende Fragen zu stellen

* Was ist die Aufgabe meiner Klasse? Was macht meine Klasse fachlich? Was ist die Aufgabe von Product, Demo und SubDemo
* Wie soll die Klasse verwendet werden, also welche Methoden soll sie nach außen bereitstellen? Das ist unabhängig davon wie es nachher intern verwaltet wird.
* Und als letzten Schritt - wie implementiere ich die Methoden der Klasse, was für Felder von welchen Typen brauche ich um den Zustand und die Daten zu speichern.


Dann hast du vielleicht Klassen, die dienen hauptsächlich dazu um Daten zu speichern - viele Attribute, hauptsächlich get/set Methoden, wenig fachliche Methoden. Aber daneben gibt es Klassen, die rein fachliche Methoden anbieten und die gar keine get/set Methoden haben - weil du nie Daten direkt änderst, sondern irgendwas durchführen willst.

Um das Beispiel mit dem Auto aufzugreifen. Du hast vielleicht eine Klasse Tank als reine Datenklasse mit Feldern "spritArt", "volumen", "inhalt". Dafür gibt es get-Methoden für alle 3 Attribute und eine set-Methode für den Inhalt.
Und dann hast du eine Klasse Auto. Die hat innen drin ein Feld vom Typ Tank. Aber das wird gar nicht per get/set nach außen freigeben. Sondern es gibt vielleicht eine Methode tanke(int liter, SpritArt) - die dann intern das Feld tank benutzt.
 
F

Fohnbit

Top Contributor
Hallo,

danke für die guten Beispiele. Ja, eigentlich muss die erste Klasse gar nicht frei gegeben werden, da nur die Elemente darin von Bedeutung sind.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
nonickatall Methoden Kann man Klassen/Methoden aus Variablen heraus aufrufen? Allgemeine Java-Themen 6
H Interface PluginSystem ClassNotFound exception für library Klassen Allgemeine Java-Themen 10
L Classpath Zur Laufzeit bestimmte Klassen in Classloader hinzufügen? Allgemeine Java-Themen 4
P Abstrakte Klassen vs. Interface Allgemeine Java-Themen 4
I Klassen aus Jar-Dateien aus anderem Ordner laden Allgemeine Java-Themen 3
D OOP Gemeinsamen ID-Raum für zwei Klassen implementieren Allgemeine Java-Themen 7
B Problem mit meinen Klassen Allgemeine Java-Themen 6
I Array Parameter mit 2 Klassen - NullPointerException Allgemeine Java-Themen 3
F Code in Klassen bringen Allgemeine Java-Themen 4
J Problem beim Generischen Klassen und Interfaces Allgemeine Java-Themen 2
F Klassen Verwendung abstrakter Klassen Allgemeine Java-Themen 9
W Variablenübergabe über mehrere Klassen Allgemeine Java-Themen 4
B Vererbung Interface und implementierende Klassen Allgemeine Java-Themen 8
D Klassen JLabels in anderen Klassen verwenden. Allgemeine Java-Themen 7
H Klassen LibGDX - Verschiedene Klassen als Value in einer Map Allgemeine Java-Themen 8
J Best Practice Objekt an alle Klassen verteilen ( Discord Bot ) Allgemeine Java-Themen 7
A Anonyme Klassen - Interface Allgemeine Java-Themen 5
scitex auf Klassen innerhalb eines package zugreifen Allgemeine Java-Themen 22
J Tetris Probleme bei Klassen Allgemeine Java-Themen 14
cool_brivk24 Klassen Klassen Aufruf Fehlgeschlagen Allgemeine Java-Themen 14
S Parametrisierte jUnit 5-Tests mit eigenen Datentypen/Klassen-Objekten als Test-Parameter Allgemeine Java-Themen 0
rentasad Design-Frage - Interfaces, Klassen, statische Methoden Allgemeine Java-Themen 3
S Klassen Abstrakte Klassen Allgemeine Java-Themen 5
T Log4J - Deaktivierung für einzelne Klassen Allgemeine Java-Themen 7
Tommy Nightmare Klassen Globale Klassen erstellen Allgemeine Java-Themen 7
X Klassen aus jar in jar Laden Allgemeine Java-Themen 1
S Klassen Klassen "virtuell" erstellen Allgemeine Java-Themen 5
J Aus mehreren Klassen ein Datei ausführbare machen Allgemeine Java-Themen 6
S equals-Methode bestimmer Klassen abfangen Allgemeine Java-Themen 2
M Klassen Eine Klasse in mehreren Klassen einbinden Allgemeine Java-Themen 11
Sin137 Struktur der Klassen & Package Allgemeine Java-Themen 2
G Klassen und interne Klassen Allgemeine Java-Themen 1
S Klassen übergeben Allgemeine Java-Themen 13
C Klassen und Konstruktor Allgemeine Java-Themen 2
S Classpath Wie kann ich Java-Library Klassen "verstecken"..? Allgemeine Java-Themen 4
A Java speech - 2 Klassen Allgemeine Java-Themen 1
V Wie kann ich die Fragen mit den anderen Klassen verbinden? Allgemeine Java-Themen 1
T Schlüsselworte mehrere public-Klassen in einem Paket Allgemeine Java-Themen 7
V Klassenname von allen Klassen mit einer bestimmten Eigenschaft bekommen Allgemeine Java-Themen 2
B Classpath Eclipse findet importierte Klassen nicht Allgemeine Java-Themen 1
C DBConnection als Methode in mehreren Klassen Allgemeine Java-Themen 4
C Arten von Klassen Allgemeine Java-Themen 3
7 Verbinden von Mehreren Klassen Allgemeine Java-Themen 29
A Klassen ein Interface aufzwingen Allgemeine Java-Themen 4
O Java-Obfuscator, welcher einzelne Methoden, Klassen und Ordnerstrukturen ausnehmen kann. Allgemeine Java-Themen 1
A also definition von klassen und string methoden und algorithmik Allgemeine Java-Themen 13
D Problem bei Vererbung abstrakter Klassen Allgemeine Java-Themen 6
M Interface Generische Klassen mit mehreren Typen überschreiben Allgemeine Java-Themen 0
L OOP Klassen-Design (static oder nicht?) Allgemeine Java-Themen 3
X Eigene Annotation - mit Bedingung für ganze Klassen oder Methoden Allgemeine Java-Themen 2
O Klassen Programm in Klassen unterteilt, werte werden nicht mehr übernommen Allgemeine Java-Themen 3
J C++ Projekt (QT) in Java mit Klassen (nicht imperativ) nutzen (BridJ? JavaCPP? SWIG? JNA? JNI?) Allgemeine Java-Themen 2
T Datentypen Eine Liste - verschiedenen Klassen - eine Abstracte Klasse Allgemeine Java-Themen 3
S .jar hat nicht alle Klassen ??? Allgemeine Java-Themen 10
S Polymorphie Polymorphismus bei Abstrakten Klassen Allgemeine Java-Themen 2
S Tool um mehrere Klassen in einer Klasse vereinen? Allgemeine Java-Themen 6
T Wie kann ich alle existierenden Java-Klassen anzeigen lassen? Allgemeine Java-Themen 10
Landei Welche Klassen fehlen im JDK? Allgemeine Java-Themen 18
S Kapselung Statische Helper Klassen Allgemeine Java-Themen 5
A Vererbung Klassen-Downcasting wirft ClassCastException Allgemeine Java-Themen 2
N Java Klassen mit ID Allgemeine Java-Themen 21
antonbracke Klassen Klassen gegenseitig laden Allgemeine Java-Themen 4
R SecurityManager für einzelne Klassen/Threads? Allgemeine Java-Themen 38
T Java Klassen aus externer .jar laden und ausführen Allgemeine Java-Themen 3
S JPA und Entity-Klassen: Wert ungültig Allgemeine Java-Themen 6
M OO / Klassen / Projektstruktur Allgemeine Java-Themen 5
O Klassen werden nicht importiert Allgemeine Java-Themen 3
E selber Klassen kompilieren/ prüfen Allgemeine Java-Themen 5
Z Abstrakte Klassen /Interface Allgemeine Java-Themen 5
A Klassen und JLabel's Allgemeine Java-Themen 12
J Java-Implementierung diverser Beziehungen zwischen Klassen bzw. Objekten Allgemeine Java-Themen 2
M Methoden/Klassen für andere Projekte Allgemeine Java-Themen 4
J Suche: Tool zum Auffinden gleichnamiger Klassen (Name und Package gleich) in unteschiedlichen JARs Allgemeine Java-Themen 5
E instanceof mit nicht öffentlichen Klassen Allgemeine Java-Themen 2
D Datentypen Typbestimmung unbekannter Wrapper-Klassen Allgemeine Java-Themen 5
S Klassen in einer Schleife durchlaufen Allgemeine Java-Themen 11
X Generic muss zwei Klassen/Interfaces erfüllen Allgemeine Java-Themen 5
N Vergleich eigener Klassen Allgemeine Java-Themen 5
M Klassen Array aus Klassen bestimmter Klassen ? Allgemeine Java-Themen 11
C OOP Klassen mit "Eigenschaften" Allgemeine Java-Themen 10
H Klassen kommunizieren lassen Allgemeine Java-Themen 3
A Problem bei Serialisierung von Bibliotheks-Klassen Allgemeine Java-Themen 6
R Implementierung eines Interface durch 2 verschiedene Klassen Allgemeine Java-Themen 6
T Classpath Klassen dynamisch erstellen Allgemeine Java-Themen 4
I Klassen Klassen-/Objektinteraktion Allgemeine Java-Themen 2
E Benötigte Klassen herausfinden Allgemeine Java-Themen 11
V Klassen in "abgeschirmten Bereich" laden? Allgemeine Java-Themen 7
S OOP Mehrfache Vererbung von abstrakten Klassen Allgemeine Java-Themen 7
L Diamond funktioniert nicht mit anonymen inneren Klassen Allgemeine Java-Themen 6
B OOP java.util.logging.Logger: Wie kann ich mehre Klassen in ein Logfile schreiben lassen? Allgemeine Java-Themen 12
M Klassen in vielen Jars ermitteln Allgemeine Java-Themen 2
H Vererbung Abgeleitete Klassen und Zugriff Allgemeine Java-Themen 2
X Klassen innerhalb einer jar ersetzen Allgemeine Java-Themen 2
J Verschiedene Klassen als "Object" in ArrayList und dann in for-Schleife erzeugen!? Allgemeine Java-Themen 2
Jats Hilfe bei Bank mit mehreren Klassen Allgemeine Java-Themen 11
D Updaten von Klassen durch jar.exe zerstört diese. Update durch WinRAR gelingt! Allgemeine Java-Themen 2
E Variablen anderer Klassen auslesen (nur Name bekannt) Allgemeine Java-Themen 4
S Gewisse Klassen des JRE ausschliessen? Allgemeine Java-Themen 8
K Liste aller implementierenden Klassen einer Oberklasse anzeigen Allgemeine Java-Themen 4
P volatile bei threadsafe Klassen nötig? Allgemeine Java-Themen 3

Ähnliche Java Themen


Oben