OOP Bidirektionale Muss-Assoziation

Arsedeus

Mitglied
Hallo zusammen,

ich stehe vor einem Problem, zu dem ich einfach keine Lösung finde. Ich versuche eine bidirektionale Muss-Assoziation zu programmieren, komme aber in der Main-Methode nicht weiter. Ich will diese Assoziation programmieren:
Schachpartie.jpg
Mein Code ist:
Java:
package assoziation.schachpartie_spieler;

public class Schachpartie {

    private String name;
    private Spieler[] spieler;

    public Schachpartie(Spieler s1, Spieler s2) {
        setName(name);
        anmelden(s1);
        anmelden(s2);
        s1.teilnehmen(this);
        s2.teilnehmen(this);
    }

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

    public String getName() {
        return name;
    }

    public Spieler[] getSpieler() {
        return spieler;
    }

    public void anmelden(Spieler s) {
        for (int i = 0; i < spieler.length; i++) {
            if (spieler[i] == null) {
                spieler[i] = s;
            }
        }

    }

}

Java:
package assoziation.schachpartie_spieler;

import java.util.ArrayList;

public class Spieler {

    private String name;
    private final ArrayList<Schachpartie> partieListe = new ArrayList<>();
    
    public Spieler(String name, Schachpartie p) {
        setName(name);
        addPartie(p);
        teilnehmen(p);
    }

    public void setName(String name) {
        this.name=name;
    }
    
    public String getName() {
        return name;
    }
    
    public void addPartie(Schachpartie p) {
        partieListe.add(p);        
    }
    
    public ArrayList<Schachpartie> getPartieListe() {
        return partieListe;
    }
    
    public void teilnehmen(Schachpartie p) {
        p.anmelden(this);
    }
    
}

Ich kann aber dann in der Main-Methode keine Objekte erstellen, da diese sich gegenseitig aufrufen müssen. Kann mir da einer weiter helfen?

Java:
package assoziation.schachpartie_spieler;

public class Main {
    
    public static void main(String[] args) {
        
        Schachpartie schachpartie1=new Schachpartie("Partie1", new Spieler("Hans"), new Spieler("Franz"));
        
    }
                        
}
 
Wenn ich dich richtig verstanden habe, dann ist Dein Problem eine Art Endlosschleife, weil sich Spieler und Partie im Kreis eintragen.

Dies kannst Du natürlich einfach durchbrechen: Bau eine Kontrolle ein:
Ist der Spieler der Partei zugeordnet? Wenn nicht, dann ordne den Spieler Zu. Und umgedreht auch.

Dann ist es halt immer so: Es wird erst eingetragen bei sich um dann den Gegenpart anzupassen. Wenn der Gegenpart dann prüft, dann erkennt er, dass nichts zu tun ist.

Man könnte die Logik auch eingrenzen. Dann wäre die Logik immer: Der Spieler wird der Partie zugeordnet und die Partie trägt sich dann auch beim Spieler ein. Einfach eine Partie beim Spieler eintragen ist dann nicht erlaubt. Hier kann der Gegen-Check natürlich auch erfolgen (z.B. mit einer Exception wenn die Eintragung erfolgen soll, ohne dass der Spieler bereits in der Partie ist) und man kann es auch etwas erzwingen: Spieler und Partie sind in einem Package, die Methode ist package private. Von außerhalb des Package kann die Methode also nicht aufgerufen werden.
 

Neue Themen


Zurück
Oben