Java 对象参考案例研究
当人员1与人员3成为合作伙伴时,人员2不应再将人员1作为合作伙伴,人员4不应再将人员3作为合作伙伴。我应该如何解决这个问题Java 对象参考案例研究,java,Java,当人员1与人员3成为合作伙伴时,人员2不应再将人员1作为合作伙伴,人员4不应再将人员3作为合作伙伴。我应该如何解决这个问题 public class Person { private String name; private Person partner; public Person(String name){ this.name = name; } public void setPartner(Person partner){
public class Person {
private String name;
private Person partner;
public Person(String name){
this.name = name;
}
public void setPartner(Person partner){
this.partner = partner;
partner.partner = this;
}
public static void main(String[] args) {
Person one = new Person("1");
Person two = new Person("2");
Person three = new Person("3");
Person four = new Person("4");
one.setPartner(two);
three.setPartner(four);
one.setPartner(three);
//Person two is still partner with person 1
//and person four is still partner with person 3
}
我认为把它作为
setPartner
中的第一行应该会起作用:this.partner.partner=null代码>
当然,您必须检查此.partner是否为null
。将setPartner更改为:
public void setPartner(Person partner){
if (this.partner != null) {
this.partner.partner = null; // Reset the partner of the old partner.
}
this.partner = partner; // Assign new partner.
this.partner.partner = this; // Set the partner of the new partner.
}
public void setPartner(Person partner){
if(this.partner != null)
this.partner.partner = null;
this.partner = partner;
partner.partner = this;
}
我建议您设置一个setRelationship
方法,该方法将对当前Person
执行setPartner
操作,如果不为空,则对旧合作伙伴执行新的removePartner
新的setRelationship
方法将就位,这样就不会对setPartner
的功能产生混淆,也不会有可能被毫无戒心的程序员忽略的副作用 这是我的代码:
public void setPartner(Person partner) {
if (this.partner != null)
this.partner.partner = null;
this.partner = partner;
if (partner.partner != null)
partner.partner.partner = null;
partner.partner = this;
}
理想情况下,您需要一种防止从Partnership以外的任何位置调用setPartnership的方法。OMG和Partnership:)此处出现8次partner:)…不计算评论。在这种情况下,原始的this.partner.partner(哦,是的,这是更多的partners)仍将设置为this.partner.partner,不是吗?如果你使用了newPartner而不是重复使用partner这个词,你会说得更清楚。还有一个副作用,就是让你去掉那些不必要的、难以理解的“这个”。你会怎么回答呢,@Bill?我从来没有见过“动作”这样的动词。“打电话”有什么我不知道的细微差别吗?没有,只是想给它添点味道。如果您愿意,我可以将“action”替换为“call”。+1因为setPartner()
没有记录它执行任何其他方法和逻辑。作为用户,我怎么知道setPartner()
将计算PI?你说:this.partner.partner=null;但合伙人是一个私人领域。。。请使用set/get方法来修复它,因为它们是同一个类,Java将允许您从同一个类的另一个实例操作私有字段——奇怪但真实。这并不是一个好主意,但在本例中,这可能是另一种避免@Ablaeul命中的丑陋递归的方法。(这个解决方案也很好地避免了这种情况)@Leni我也希望使用setPartner,但是如果不创建另一个helper方法(比如removePartner),这是不可能的。在原始伙伴上调用setPartner(null)将导致严重破坏。无论如何,就像比尔说的,我们可以访问private字段,只要它是同一个类,不需要是同一个对象。这个private.private对我来说很奇怪。我不知道它有用。我会翻阅书籍/规格说明为什么会这样,因为我看不出明显的原因。
public void setPartner(Partner b) {
// Special case, otherwise we'll have troubles
// when this.partner is already b.
if (this.partner == b) return;
if (this.partner != null) {
this.partner.partner = null;
}
this.partner = b;
// Make sure that the new partner has the right partner.
// This will make sure the original b.partner has its
// partner field nullified.
// Note that if we don't have the special case above,
// this will be an infinite recursion.
b.setPartner(this);
}
class Person {
String name;
Partnership partnership;
void setPartnership(Partnership p) {
partnership=p;
}
}
class Partnership {
Person partner1;
Person partner2;
public setPartners(Person p1,Person p2) {
p1.setPartnership(this);
p2.setPartnership(this);
}