Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 对象参考案例研究_Java - Fatal编程技术网

Java 对象参考案例研究

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){

当人员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){
        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);
}