Wie die Multiplizität zweier bidirektionaler Klassen umsetzen?

titom36

Neues Mitglied
Angenommen, ich habe zwei Klassen: Ehemann und Ehefrau. Diese sind bidirektional miteinander verbunden. Ein Ehemann muss genau eine Ehefraue haben. Eine Ehefrau muss genau einen Ehemann haben. Wie kann ich diese Anforderung programmiertechnisch umsetzen? Kann ich effizient verhindern, dass Objekte existieren, die keinen Ehemann bzw. keine Ehefrau haben?

Java:
class Ehefrau
{
    private Ehemann meinEhemann;
 
    public Ehefrau(Ehemann einEhemann) {
        this.meinEhemann = einEhemann;
    }
}

class Ehemann
{
    private Ehefrau meineEhefraue;
 
    public Ehemann(Ehefrau eineEhefrau) {
        this.meineEhefraue = eineEhefrau;
    }
}

So kann ich natürlich keine der beiden Klassen instanziieren. Nehme ich nun bspw. den Konstruktor für Ehemann raus, ist es allerdings möglich, dass Objekte vom Typ Ehemann ohne eine Ehefrau existieren.

Java:
class Ehefrau
    {
        private Ehemann meinEhemann;
        
        public Ehefrau(Ehemann einEhemann) {
            einEhemann.setzeEhefrau(this);
            this.meinEhemann = einEhemann;
        }
    }

class Ehemann
{
    private Ehefrau meineEhefraue;
    
    public void setzeEhefrau(Ehefrau eineEhefrau) {
        this.meineEhefraue = eineEhefrau;
    }
}

Das Problem welches ich sehe, ist die Tatsache, dass nun die Ehefrau dafür zuständig ist, dem Ehemann mitzuteilen, zu welcher Ehefrau er gehört (einEhemann.setzeEhefrau(this);). Tut die Ehefrau dies nicht, besteht die Möglichkeit, einen Ehemann zu haben, welcher keine Ehefrau besitzt. Die Ehefrau stellt also gewissermaßen Funktionalität des Ehemanns bereit. Ist dieses Problem lösbar?
 

Gucky

Top Contributor
Dafür hat die übergeordnete Instanz zu sorgen.
Mit einer Methode hasWife() oder hasHusband() kannst du abfragen, ob ein Ehepartner vorhanden ist. Falls nicht, wird einer gesetzt oder das Objekt wird zerstört.
Die Unterklassen müssen nicht dafür sorgen. Oder du lässt einen Ehepartner selber den anderen erstellen und dieser gibt auf Anfrage die Instanz des Partners zurück.
 
Zuletzt bearbeitet:

HarleyDavidson

Bekanntes Mitglied
Dafür würde ich eine Art "Ehepartner-Factory" erstellen.
Und in der kannst du dann absichern, dass die Factory nur Objekte erstellt, die diese Vorgaben entsprechen.
 

Andreas-P

Neues Mitglied
Hi,

Du bist dir in Klarem darüber, dass bei dieser Art von Beziehung sobald der Ehemann stirbt, auch die zugehörige Ehefrau sterben muss und umgekehrt :)?

Ich meine es gibt technisch gar keine Lösung um eine 1:1 Beziehung 100% korrekt umzusetzen weil, es da immer das Henne-Ei Problem gibt. Die bereits erwähnte Factory wäre hier wohl das Mittel der Wahl um die korrekte Erzeugung der Beiden sicher zu gewährleisten.

An dieser Stelle jedoch die Frage, welchen Sinn macht eine bidirektionale 1:1 Beziehung? Würde es bei dieser Konstellation sich nicht anbieten aus Ehemann und Ehefrau gleich die Klasse Ehepaar zu gestalten, schließlich sind beide Klassen offensichtlich extrem aneinander gekoppelt (so könnte man die Ehe ja durchaus interpretieren :))?

Eventuell bietet sich eine Assoziationsklasse 'Ehe' an. Die könnte dann Frau und Mann die verheiratet sind halten. In liberaleren Gesellschaften vielleicht auch Mann und Mann oder Frau und Frau. Bei den Mormonen ggf. auch etwas mehr Ehepartner. Sprich du hast wesentlich mehr Gestaltungsspielraum. Vor allem wenn Du deine Ehepartner über ein Interface etwas abstrakter gestaltest.

Indem Du der Assoziationsklasse 'Ehe' ein getEhepartner(...) hinzufügst, und die Assoziationsklasse den Ehepartner selbst über ein setEhe(...) bekannt machst, könntest Du dann auch wieder zwischen den Ehepartnern navigieren.

Viele Grüße,
Andreas
 

strußi

Top Contributor
und um noch eins draufzusetzten kann man mit der lösung von Andreas-P noch die gleichgeschlechtliche ehe implementieren, so hättest du nur die "klassische" Variante
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
ZH1896ZH Performance Testing zweier Architekturen Softwareentwicklung 7

Ähnliche Java Themen

Neue Themen


Oben