Wie richten Sie eine bidirektionale Assoziation zwischen zwei Objekten in OO Java
Ich habe einen grundauftrag zu tun, aber bin sehr neu in OOP und mit ihm zu kämpfen. Andere online-Ressourcen ab, um zu meiner Verwirrung.
Bin ich verpflichtet zu:
-
Schreiben Sie den code für eine Klasse Person. Ein Person-Objekt um die Attribute name, Alter und Adresse.
-
Schreiben Sie den code für ein Klasse Hund. Ein Hund-Objekt um die Attribute name und Alter.
-
Geben Sie zusätzliche code in der Mensch und Hund, der Klassen, der erforderlich ist zum einrichten einer bidirektionalen Verknüpfung zwischen einer Person, die Objekt-und ein Hund-Objekt. Ein Person-Objekt fungiert als ein Eigentümer für ein Hund-Objekt, und der Hund-Objekt fungiert als ein Haustier für das Objekt Person.
-
Ändern Sie Ihre Klasse Person, so dass ein Person-Objekt können Sie sich als Besitzer für bis zu 20 Hund-Objekte.
Offensichtlich ist dies ein sehr einfaches Beispiel.
Meine code so weit:
Person-Klasse :
public class Person
{
//instance variables - replace the example below with your own
private String name;
private int age;
private String address;
/**
* Constructor for objects of class Person
*/
public Person()
{
this.name = name;
this.age = age;
this.address = address;
}
//Set Methods:
public void setName () {
this.name = name;
}
public void setAge () {
this.age = age;
}
public void setAddress () {
this.address = address;
}
//Get Methods:
public String getName () {
return name;
}
public int getAge () {
return age;
}
public String getAddress () {
return address;
}
}
Hund Klasse:
public class Dog
{
//instance variables - replace the example below with your own
private String name;
private int age;
public Dog()
{
this.name = name;
this.age = age;
}
//Set Methods:
public void setName () {
this.name = name;
}
public void setAge () {
this.age = age;
}
//Get Methods:
public String getName () {
return name;
}
public int getAge () {
return age;
}
}
Main:
public class Main
{
//Blank
}
Ich weiß, dieser code ist derzeit nutzlos und nicht alles tun, aber ich bin unsicher, wie 'zuordnen' werden die Objekte & wo es zu tun. Die Zuordnung spec gibt eine person fungiert als "Eigentümer" für den Hund.
Dies ist, wo mein problem liegt. Die Einrichtung der Beziehung zwischen den Objekten.
- Möchten Sie die Beziehung zu internen (als eine person, hat eine Sammlung von Hunden, die als ein Feld und ein Hund hat einen Besitzer wie ein Feld) oder externe (zum Beispiel eine Karte mit der Beziehung)
- Ich vermute, die interne wie die spec gibt ich muss
- "Ändern Sie die Person-Klasse, so dass ein Person-Objekt können Sie sich als Besitzer für bis zu 20 Hund-Objekte."
- Fügen Sie einfach die Methoden setDog(Hund), in Person, und dann setOwner(Person Besitzer) im Hund. Es ist einfach so 🙂
- Hollowood-Prinzip 😉
- kann ein Hund ein Tier für mehr als 1 Person?
- Ich würde auch ein Factory-Klasse instanziiert Hund(en), Person, legt die Beziehungen über die setter-Aufrufe, und nur dann macht die erstellten Objekte zugänglich für den rest der Anwendung.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das größte problem hier ist die Konsistenz: wenn ein Hund d1 ist ein Haustier für eine Person p1, dann p1 müssen Besitzer von d1, und Umgekehrt. Wenn, wie von vielen vorgeschlagen, wir haben 2 Methoden (
Person.addDog()
undDog.setOwner()
), dann kann ein Benutzer leicht einen Fehler machen und scheitern nennen beide Methoden (oder Aufruf mit falschen Argumenten). Da ein Hund kann nur einen Besitzer haben, eine einfache und sichere Schnittstelle wäre mit einer einzigen MethodeDog.setOwner(Person p)
, wop
kann null sein, wenn wir wollen, dass der Hund keinen Besitzer. Diese Methode, neben der Einstellung der FeldDog.owner
, müssen entfernen Sie diesen Hund aus der pet-Liste der früheren Besitzer und (wenn p != null) hinzufügen, die sich auf die pet-Liste der neuen Eigentümer. Die Methoden der KlassePerson
hinzufügen und entfernen Haustiere sollten sichtbar für die KlasseDog
aber für den Benutzer nicht sichtbar (Sie sollte Paket private), während die MethodeDog.setOwner
sollte öffentlich sein.Dies ist ein häufiges problem bei bidirektionalen Beziehungen; Sie können nicht passieren Sie in den Konstruktor, weil man es noch nicht, wenn die andere initialisiert ist. Aus diesem Grund müssen Sie den "Draht, bis Sie von außen"
Ihre Erwähnung von 20 Hunde schlägt vor, dass Sie möchten, dass Sie verwenden eine Vielzahl zu halten, die Hunde, aber einer arraylist besser werden würde. Ich werde mit der arraylist, aber kann Ihnen zeigen, wie das funktionieren würde mit einem array, wenn Sie möchten,
Ebenso der Hund-Klasse, eine Besitzer
Mithilfe dieser beiden Methoden können Sie die bidirektionale Beziehung.
Hinweise
Dies ist offensichtlich eine Zuordnung, so dass Sie keine Wahl haben, aber für die Zukunft; bidirektionale Beziehungen, wie dies nützlich sein kann. Aber Sie sind auch gefährlich, wenn falsch verwendet; das wichtigste ist, dass nach der Initialisierung eines Objekts muss die Arbeit ohne Fehler. Es muss sich nicht auf die setOwner() oder giveDog() aufgerufen wird: in anderen Worten, ein petless person und ein Hund herrenlos Verhalten müssen "richtig" (was auch immer das bedeutet in diesem Zusammenhang. Gelingt dies nicht, kann dazu führen, bug-anfällig code. Wenn dies impracticle dann muss es unmöglich sein, für herrenlos Hunde oder dogless Menschen ausgesetzt sind, der rest des Programms; factory-Methoden können nützlich sein, aber das sprengt den Rahmen dieser Frage
Da beide Objekte können nicht erstellt werden, zur gleichen Zeit, die Sie nicht passieren können Verweise auf einander in den Konstruktor. Erstellen Sie getter-und setter-Methoden, so können Sie diese Beziehung, nachdem die Objekte erstellt werden. Ein Beispiel HIERFÜR ist wie folgt:
Was müssen Sie tun, sieht aus wie ein die zirkuläre Abhängigkeit Problem. Also, was Sie tun können, ist die Verwendung der Objekt-Zusammensetzung.
Einfach hinzufügen, um Ihre Klassen einer Instanz-Variablen des zweiten Typs:
bzw. im
Dog
Klasse, jeder Hund hat seinen Besitzer:Vergessen Sie nicht, setter und Getter.
Wie für den Punkt 4):
Anstatt jeden
Person
Objekt haben eineDog
Mitglied, ein array verwenden, oder einige Collection (List, Set, etc.):Also statt
tun
Versuchen, diese:
//PERSON
//HUND