所以我在我的驱动程序类中有这样的东西:
Person person1 = new Person(home1, job1);
Home home1 = new Home(person1);
Job job1 = new Job(person1);
其中Person构造函数的参数是home和job,而home构造函数的参数是owner,而job构造函数的参数是employee。我怎么能做这个工作?
答案 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
时,尚未创建home1
和job1
。由于相互依赖性,这种方法总会将某些内容传递给一个本身尚未初始化的构造函数。
您需要在没有引用的情况下创建这些对象,然后在实例化后使用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
现在你可以为这三个人做任何你想做的事。