如何在OO Java中设置两个对象之间的双向关联

Ano*_*mus 7 java oop class object

我有一个基本的任务,但对OOP来说是非常新的并且正在努力.其他在线资源开始增加我的困惑.

我需要:

  1. 编写类Person的代码.Person对象具有属性名称,年龄和地址.

  2. 编写类Dog的代码.Dog对象具有属性名称和年龄.

  3. 在Person和Dog类中提供设置Person对象和Dog对象之间的双向关联所需的任何其他代码.Person对象充当Dog对象的所有者,Dog对象充当Person对象的宠物.

  4. 修改Person类,以便Person对象可以充当最多20个Dog对象的所有者.

显然这是一个非常简单的例子.

我的代码到目前为止:

人员类:

    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;
    }
}
Run Code Online (Sandbox Code Playgroud)

狗类:

    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;
    }


}
Run Code Online (Sandbox Code Playgroud)

主要:

public class Main
{
   //Blank 
}
Run Code Online (Sandbox Code Playgroud)

我知道这段代码目前没用,并且没有做任何事情,但我不确定如何"关联"对象和在哪里做.作业规范指定一个人充当狗的"所有者".

这就是我的问题所在.设置对象之间的关系.

Ale*_*dov 8

这里的主要问题是一致性:如果Dog d1是Person p1的宠物,那么p1必须是d1的所有者,反之亦然.如果像许多人建议的那样,我们有2个方法(Person.addDog()Dog.setOwner()),那么用户很容易犯错并且无法调用这两个方法(或者使用错误的参数调用).由于Dog只能拥有一个所有者,因此简单而安全的界面将使用单一方法Dog.setOwner(Person p),p如果我们希望狗没有所有者,则可以为null.除了设置字段之外,此方法Dog.owner必须从前一个所有者的宠物列表中删除此狗,并且(如果p!= null)将其自身添加到新所有者的宠物列表中.Person添加和删​​除宠物的类的方法应该对类可见,Dog但对用户不可见(它们应该是包私有的),而方法Dog.setOwner应该是公共的.


Ric*_*gle 2

这是双向关系的常见问题;您不能在构造函数中传递它们,因为当另一个初始化时,其中一个还不存在。因此,您必须“从外部连接它们”

你提到的 20 条狗表明他们希望你使用数组来保存狗,但数组列表会更好。我将使用数组列表,但如果您愿意,可以向您展示如何使用数组

public class Person
    {
    ArrayList<Dog> dogs=new ArrayList<Dog>(); //this will hold all the dogs that the Person has as pets

    public void giveDog(Dog dog){
       dogs.add(dog)
    }
    .....
    .....
Run Code Online (Sandbox Code Playgroud)

同样,狗类也有一个主人

public class Dog
    {
    Person owner;

    public void setOwner(Person owner){
       this.owner=owner;
    }
    .....
    .....
Run Code Online (Sandbox Code Playgroud)

使用这两种方法可以创建双向关系。

笔记

这显然是一项任务,所以你别无选择,只能为了未来;像这样的双向关系可能很有用。但如果使用不当,它们也很危险。最重要的是,初始化后对象必须正常工作。它不能依赖于 setOwner() 或 GiveDog() 被调用:换句话说,无宠物的人和无主的狗必须表现得“正确”(无论这在上下文中意味着什么。未能实现这一点可能会导致容易出现错误的代码。如果这是不切实际的,那么无主的狗或无狗的人肯定不可能接触到程序的其余部分;工厂方法对此可能有用,但这超出了这个问题的范围