UML Diagramm

Diskutiere UML Diagramm im Java Basics - Anfänger-Themen Bereich.
S

Snaer

Aber bezieht sich kunstmuseum.addKunstwerk(this); nicht automatisch auf eine Liste oder habe ich da etwas falsch verstanden?
Java:
class Foo {
 
    Bar bar; // Foo hat ein Bar als Instanzvariable
 
    public void setBar(Bar bar){ // und eine Methode mit der bar gesetzt werden kann
        this.bar = bar;
    }
}

class Bar {
 
    public Bar(Foo foo) { // Bar erwartet ein Foo als Parameter
        foo.setBar(this); // und setzt sich selbst als das bar von foo
    }
}

public static void main(String[] args) {

    Foo foo = new Foo();
    Bar bar = new Bar(foo);
}
Und jetzt ist deine Übertragungsleistung gefordert! ;)
Da die Klasse Kunstwerk ein museum als Variable besitzt gehe ich davon aus, dass ich einen ähnlichen Konstruktor in der Klasse Kunstmuseum erstellen muss.
Code:
public class Kunstmuseum {

    public Kunstmuseum (Kunstwerk kunstwerk) {
        kunstwerk.setMuseum(this);
    }
}
Ist die Main Methode in deinem Beispiel dabei essentiell notwendig? Oder würde diese quasi vom Test bereits ausgeführt werden, da dort ja 2 Objekte erzeugt werden?
 
T

temi

Aber bezieht sich kunstmuseum.addKunstwerk(this); nicht automatisch auf eine Liste oder habe ich da etwas falsch verstanden?
Erläutere mal was du damit genau meinst?

Worauf sich die Methode addKunstwerk() bezieht, dass hast du ja mit deinem Code selbst in der Hand.

Da die Klasse Kunstwerk ein museum als Variable besitzt gehe ich davon aus, dass ich einen ähnlichen Konstruktor in der Klasse Kunstmuseum erstellen muss.
Nein.

Irgendwie scheinst du nur herumzuprobieren ohne es zu verstehen. Hast du genau verstanden, was der Beispielcode macht?
 
S

Snaer

Erläutere mal was du damit genau meinst?

Worauf sich die Methode addKunstwerk() bezieht, dass hast du ja mit deinem Code selbst in der Hand.
Ist addKunstwerk nicht automatisch auf eine Liste bezogen? Also quasi eine Vorgehensweise um ein Objekt zu einer bestimmten Liste hinzuzufügen, im Fall von kunstmuseum.addKunstwerk() dann, um ein Kunstwerk Objekt zu einer kunstmuseum Liste hinzuzufügen? Oder wird das Kunstwerk durch den Befehl dann einfach nur der Klasse zugeordnet?
Nein.

Irgendwie scheinst du nur herumzuprobieren ohne es zu verstehen. Hast du genau verstanden, was der Beispielcode macht?
So wie ich es verstanden habe müsste es sich so verhalten:
Also du hast ja 2 verschiedene Klassen einmal Foo und Bar. Ich bin jetzt davon ausgegangen, dass die Klasse Foo quasi äquivalent zu meiner Klasse Kunstwerk sei, da du in Foo eine Variable bar vom Typ Bar erstellst. Ähnliches tue ich ja in meiner Klasse Kunstwerk indem ich ein musuem vom Typ Kunstmuseum erzeuge.
Und anschließend übergibst du in der Klasse Bar dann ein foo vom Typ Foo und fügst es durch den Befehl foo.setBar(this); dann zu einer passenden Bar hinzu.
 
T

temi

Ist addKunstwerk nicht automatisch auf eine Liste bezogen? Also quasi eine Vorgehensweise um ein Objekt zu einer bestimmten Liste hinzuzufügen, im Fall von kunstmuseum.addKunstwerk() dann, um ein Kunstwerk Objekt zu einer kunstmuseum Liste hinzuzufügen?
Ja. In der Regel sind Methoden die mit add...() beginnen, dazu da um einer Liste etwas hinzuzufügen. Da du diese Methode selbst programmiert hast, weißt du ja genau, was sie tut.

Du möchtest doch ein Kunstwerk einer Liste von Kunstwerken in einem Museum hinzufügen. Dann mach das doch endlich!

So wie ich es verstanden habe müsste es sich so verhalten:
Ersetze Foo mit Kunstmuseum und Bar mit Kunstwerk.

Und anschließend übergibst du in der Klasse Bar dann ein foo vom Typ Foo und fügst es durch den Befehl foo.setBar(this); dann zu einer passenden Bar hinzu.
Das stimmt so nicht. Es wird dem Konstruktor von Bar eine Instanz von Foo übergeben und dieser Instanz von Foo wird eine Instanz von Bar hinzugefügt.
 
J

JustNobody

Eine Methode fügt nur ein Sache hinzu, die man mit einem Objekt machen kann.

Das ist also so, als ob ich weiß, wie man Auto fährt (Ich habe eine Methode fahre(Fahrzeugm Ziel). Ich kann Auto fahren und will von A nach B. Und es steht ein Auto bei mir gerade so rum..... Wie komme ich jetzt von A nach B?
Da nutze ich mein Wissen um das Auto fahren und nehme das Auto und fahre nach B. Also fahre(auto, B).

Also einem Kunstmuseum kann man Kunstwerke hinzu fügen. Aber das nützt doch nichts, so lange niemand das tut!
Also muss jemand das addKunstwerk aufrufen! Daher schau doch einmal, was für Code durchlaufen wird!
Wenn dir da noch der Überblick fehlt: Schreib in jede Methode ein println Befehl! Also sowas:
Code:
public class SomeClass {
  public void someMethod() {
    System.out.println("In SomeClass::someMethod!");
    // ....
  }
}
Wenn Du dann ein Kunstwerk erstellst, dann siehst Du ja auf der Konsole, was für Funktionen durchlaufen werden ....
Und da kannst Du dann mal schauen:

Was brauchst Du, um ein Kunstwerk einem Museum hinzuzufügen?
a) Ein Museum
b) Ein Kunstwerk
==> Hast du beides, dann kannst Du addKunstwerk aufrufen auf dem Mesum und das Kunstwerk übergeben....
 
S

Snaer

Also einem Kunstmuseum kann man Kunstwerke hinzu fügen. Aber das nützt doch nichts, so lange niemand das tut!
Also muss jemand das addKunstwerk aufrufen! Daher schau doch einmal, was für Code durchlaufen wird!


Was brauchst Du, um ein Kunstwerk einem Museum hinzuzufügen?
a) Ein Museum
b) Ein Kunstwerk
==> Hast du beides, dann kannst Du addKunstwerk aufrufen auf dem Mesum und das Kunstwerk übergeben....
Also ich brauche ein Kunstwerk und ein Musuem.. ein Museum habe ich ja selbst noch mal initialisiert. Muss ich das selbe dann auch für ein Kunstwerk machen, also in der Klasse Kunstmuseum dann eine Variable Kunstwerk kunstwerk; initialisieren oder ist die Klasse Klasse Kunstwerk dabei genügend?

Du möchtest doch ein Kunstwerk einer Liste von Kunstwerken in einem Museum hinzufügen. Dann mach das doch endlich!

Ersetze Foo mit Kunstmuseum und Bar mit Kunstwerk.

Das stimmt so nicht. Es wird dem Konstruktor von Bar eine Instanz von Foo übergeben und dieser Instanz von Foo wird eine Instanz von Bar hinzugefügt.
Also liege ich dann richtig in der Annahme das mir noch eine Variable Kunstwerk kunstwerk in der Klasse Kunstmuseum fehlt? Da die Klasse Foo ja eine bar initialisiert.

Ich verstehe leider noch nicht wieso die Methode addWerk nicht das besagte Kunstwerk zu dem Museum hinzufügt.
Also ich rufe sie scheinbar nirgendwo auf soweit habe ich es verstanden, aber wie rufe ich denn die Methode auf?
Mittels kunstmuseum.addwerk(this);?
 
J

JustNobody

Du brauchst keine Variable mehr im Kunstmuseum. Kunstmuseum hat eine Funktion um ein Kunstwerk hinzu zufügen.

Das ist also so, wie bei Dir: Dir kann man Geld geben. Aber wenn Dir niemand Geld gibt, dann hast Du kein Geld. Da spielen auch weitere Geldbörsen oder Tresore oder sonst was keine Rolle....

Alles was fehlt ist doch, dass Dir nun endlich jemand Geld gibt!

Und im Konstruktor von Kunstwerk hast Du doch
a) ein Kunstwerk (this)
b) Das Kunstmuseum (Parameter des Konstruktors)

Also wie bekommst Du im Konstruktor nun das Kunstwerk in das Museum?
 
T

temi

Also ich brauche ein Kunstwerk und ein Musuem.. ein Museum habe ich ja selbst noch mal initialisiert. Muss ich das selbe dann auch für ein Kunstwerk machen, also in der Klasse Kunstmuseum dann eine Variable Kunstwerk kunstwerk; initialisieren oder ist die Klasse Klasse Kunstwerk dabei genügend?
Schau doch mal den Test an:
Java:
    public void test() {
        Kunstmuseum kunstmuseum = new Kunstmuseum(); // hier wird das Museum erzeugt!!!
        kunstmuseum.setName("Koblenzer Kunstmuseum");
        // asserts...
       
        Kunstwerk kunstwerk1 = new Statue(kunstmuseum); // und hier die Kunstwerke!!!
        Kunstwerk kunstwerk2 = new Gemaelde(kunstmuseum);
        // asserts...
Da hier nirgends eine Methode aufgerufen wird, die ein Kunstwerk dem Museum hinzufügt, muss das zwangsläufig irgendwo im Konstruktor der Kunstwerke passieren.

Die beiden Kunstwerke bekommen ja auch das Museum als Parameter mit.
 
S

Snaer

Du brauchst keine Variable mehr im Kunstmuseum. Kunstmuseum hat eine Funktion um ein Kunstwerk hinzu zufügen.

Das ist also so, wie bei Dir: Dir kann man Geld geben. Aber wenn Dir niemand Geld gibt, dann hast Du kein Geld. Da spielen auch weitere Geldbörsen oder Tresore oder sonst was keine Rolle....

Alles was fehlt ist doch, dass Dir nun endlich jemand Geld gibt!

Und im Konstruktor von Kunstwerk hast Du doch
a) ein Kunstwerk (this)
b) Das Kunstmuseum (Parameter des Konstruktors)

Also wie bekommst Du im Konstruktor nun das Kunstwerk in das Museum?
Meinst du diesen Konstruktor ?
Code:
 public Kunstwerk(Kunstmuseum museum) {
        if (museum == null) {
            throw new IllegalArgumentException();
        }
        this.setMuseum(museum);
    }
Ich nehme dass an ich das Kunstwerk dann durch den Befehl museum.addKunstwerk(this); im Konstruktor hinzufügen kann.
 
T

temi

Sprich so dann? ^^
Code:
 public Kunstwerk(Kunstmuseum museum) {
        if (museum == null) {
            throw new IllegalArgumentException();
        }
        this.setMuseum(museum);
        museum.addKunstwerk(this);
    }
Also was ich überhaupt nicht verstehe und auch kein Verständnis dafür habe:

Warum probierst du es nicht einfach mal aus?

Wenn du Java lernst, dann musst du doch zwangsläufig auch einen Computer haben, auf dem Java (und bestenfalls auch eine IDE) installiert ist.

Schreib deine Klassen und teste sie!

Notfalls schreib eine kleine main() mit:
Java:
Kunstmuseum kunstmuseum = new Kunstmuseum(); // hier wird das Museum erzeugt!!!

Kunstwerk kunstwerk1 = new Statue(kunstmuseum); // und hier die Kunstwerke!!!
Kunstwerk kunstwerk2 = new Gemaelde(kunstmuseum);

System.out.println(kunstmuseum.getWerke().size()); // Erwartet: 2 => Stimmt das Ergebnis?
 
S

Snaer

Also was ich überhaupt nicht verstehe und auch kein Verständnis dafür habe:

Warum probierst du es nicht einfach mal aus?

Wenn du Java lernst, dann musst du doch zwangsläufig auch einen Computer haben, auf dem Java (und bestenfalls auch eine IDE) installiert ist.

Schreib deine Klassen und teste sie!
Da ich zuvor blind ausprobiert hatte und in die falsche Richtung gedacht hatte war ich mir unsicher ob ich in die richtige Richtung denke :rolleyes:

Jedenfalls habe ich den Fehler zwar weg bekommen, jedoch habe ich nun das Problem, dass meine add Methode in einer Endlosschleife endet und ich mir auch nach längerem ausprobieren leider nicht bewusst werde woran es liegt..

Code:
public abstract class Kunstwerk {

    private String name;
    private double preis;
    private Kunstmuseum museum;
    private Person besitzer;

    public Kunstwerk(Kunstmuseum museum) {
        if (museum == null) {
            throw new IllegalArgumentException();

        }

        this.setKunstmuseum(museum);
        museum.addKunstwerk(this);
    }

    public void setKunstmuseum(Kunstmuseum museum) {
        this.museum = museum;
    }

    public Kunstmuseum getMuseum() {
        return museum;
    }

    public void setBesitzer(Person besitzer) {
        this.besitzer = besitzer;
    }

    public Person getBesitzer() {
        return besitzer;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getPreis() {
        return preis;
    }

    public void setPreis(double preis) {
        this.preis = preis;
    }

}




import java.util.ArrayList;

public class Kunstmuseum {

    private ArrayList<Kunstwerk> werke = new ArrayList<Kunstwerk>();
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setWerke(ArrayList<Kunstwerk> werke) {
        this.werke = werke;
    }

    public ArrayList<Kunstwerk> getWerke() {

        return werke;
    }

    public void addKunstwerk(Kunstwerk kunstwerk) {

        addKunstwerk(kunstwerk);
        this.werke.add(kunstwerk);
    }

    public void removeKunstwerk(Kunstwerk kunstwerk) {

        removeKunstwerk(kunstwerk);
        this.werke.remove(kunstwerk);
    }
}
Soweit ich es bis jetzt verstanden habe, habe ich mir selbst mit der Methode public void addKunstwerk(Kunstwerk kunstwerk) in der Klasse Kunstmuseum eine Endlosschleife gebaut.
 
mihe7

mihe7

Soweit ich es bis jetzt verstanden habe, habe ich mir selbst mit der Methode public void addKunstwerk(Kunstwerk kunstwerk) in der Klasse Kunstmuseum eine Endlosschleife gebaut.
Richtig. Eine endlose Rekursion, die irgendwann mit einem StackOverflowError abbrechen wird.
 
S

Snaer

Richtig. Eine endlose Rekursion, die irgendwann mit einem StackOverflowError abbrechen wird.
Würdest du mir erläutern woran es liegt? Denn der Grund ist mir nicht ersichtlich.
Ich kann ja erläutern, wie ich es mir vorgestellt hatte.
Ich bin davon ausgegangen das ich in Kunstwerk durch museum.addKunstwerk(this); die Methode in der Klasse Kunstmuseum aufrufe und es dann anschließend durch die Methode in Kunstmuseum hinzufüge.
Das ich da irgendetwas falsch verstanden habe bzw. übersehe ist mir durch den Fehler bewusst, nur leider finde ich nicht heraus was genau.
 
T

thecain

Das ist doch der einfachste StackOverflow dens gibt du rufst ja direkt in addKunstwerk nochmal addKunstwerk auf...
 
S

Snaer

Das ist doch der einfachste StackOverflow dens gibt du rufst ja direkt in addKunstwerk nochmal addKunstwerk auf...
Okay dummer Fehler :rolleyes: Ich hatte es bereits weggelassen, nur wenn ich es weg lasse bekomme ich eine andere Fehlermeldung zurück.
Code:
java.lang.AssertionError: expected:<[email protected]> but was:<null>
    at org.junit.Assert.fail(Assert.java:88)
    at org.junit.Assert.failNotEquals(Assert.java:834)
    at org.junit.Assert.assertEquals(Assert.java:118)
    at org.junit.Assert.assertEquals(Assert.java:144)
    at PublicTests.test(PublicTests.java:41)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:52)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.junit.runners.Suite.runChild(Suite.java:128)
    at org.junit.runners.Suite.runChild(Suite.java:27)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
    at org.junit.runner.JUnitCore.runMain(JUnitCore.java:77)
    at org.junit.runner.JUnitCore.main(JUnitCore.java:36)
Da diese zuvor nicht da war hatte ich es wieder rein geschrieben.
 
Thema: 

UML Diagramm

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben