Java - 参数中彼此相互对象

时间:2013-11-19 23:20:09

标签: java object parameters

所以我在我的驱动程序类中有这样的东西:

Person person1 = new Person(home1, job1);

Home home1 = new Home(person1);

Job job1 = new Job(person1);

其中Person构造函数的参数是home和job,而home构造函数的参数是owner,而job构造函数的参数是employee。我怎么能做这个工作?

5 个答案:

答案 0 :(得分:4)

尽可能避免循环依赖。但是,您可以通过从外部连接它们来完成此操作。所以:

Person person1 = new Person();

Home home1 = new Home(person1);
person1.setHome(home1);

Job job1 = new Job(person1);
person1.setJob(job1);

正如我经常说的那样,但是在仔细使用时偶尔会有用。但是,执行此操作总是不明智,并使Person依赖于.setHome(home1);.setJob(job1);被调用;换句话说,无家可归的失业者Person应该仍然没有错误地运作。

答案 1 :(得分:3)

您不能像代码那样转发引用变量。创建person1时,尚未创建home1job1。由于相互依赖性,这种方法总会将某些内容传递给一个本身尚未初始化的构造函数。

您需要在没有引用的情况下创建这些对象,然后在实例化后使用setter方法来创建关系。像这样:

Person person1 = new Person();
Home home1 = new Home();
Job job1 = new Job();

person1.setHome(home1);
home1.setOwner(person1);
person1.setJob(job1);
job1.setOnwer(person1);

答案 2 :(得分:3)

首先,做这样的事情并不好,所以最好的解决方案是重新思考解决方案:)

无论如何,如果你真的必须这样做,你可以将初始化从构造函数移动到其他方法(例如setter)。可能的解决方案之一:

public class Home {
     // ...

     public void setPerson(Person person) {
          // ...
     }
}

public class Job {
     // ...

     public void setPerson(Person person) {
          // ...
     }
}

public class Person {

     // ...

     public void Person(Home home, Job job) {
          job.setPerson(this);
          home.setPerson(this);
          // ...
     }
}

// ...
Home home = new Home();
Job job = new Job();
Person person = new Person(home, job);

答案 3 :(得分:2)

只是构造函数是不可能的 - 因为在创建对象之前不能使用它们,并且在赋值(有意义的)值之前不能使用变量!因此,必须使用mutators(或字段访问):

// No circular deps yet
Home home1 = new Home();
Job job1 = new Job();
Person person1 = new Person(home1, job1);
// Connect back to person
home1.setPerson(person1);
job1.setPerson(person1);

但是,此手动分配很容易被遗忘或以其他方式错误应用。这种父子关系建立可以被清理的一种方式 - 并且在各种UI或其他对象图库中完成 - 是使“添加”方法建立相反的关系。然后它可以“简化”为:

Home home1 = new Home();
Job job1 = new Job();
Person person1 = new Person(home1, job1);
// Note that only one side of the dependency has been manually assigned above!

// Which in turn takes care of the appropriate logic to
// establish the reverse dependency ..
public Person (Home home, Job job) {
   this.home = home;
   this.home.setPerson(this);
   // ..
}

添加警卫以使家庭/工作实例不会“意外”重新分配给其他人也可能是谨慎的。

答案 4 :(得分:2)

假设Person是您的主要对象(某人拥有作业且拥有主页),您可以在其构造函数中创建一个新{ {1}}和新的Home并将其引用传递给此人。

Job

您的public class Person { private Home home; private Job job; public Person() { this.home = new Home(this); this.job = new Job(this); } public Home getHome() { return this.home; } public Job getJob() { return this.job; } } Home类显然必须在其构造函数中使用Job

回到你的驱动程序中,你所需要的只是:

Person

现在你可以为这三个人做任何你想做的事。