2017-06-04 71 views
0

所以我不知道怎样来写这个所以我就在这里给出一个例子:参数悖论? (不知道如何字)

public class test { 
    private Object1 o1; 
    private Object2 o2; 
    private Object3 o3; 

    public test() { 
     o1 = new Object1(o2, o3); 
     o2 = new Object2(o1); 
     o3 = new Object3(o1); 
    } 
} 

所以我的问题是,我需要给这3个对象的参数,这些方式和我得到的问题,因为当我把o2和o3放在o1时,它们是空的。如果我尝试在o1上方实例化o2和o3,则o1为空,并且问题再次出现。有人可以帮我找到解决办法。我还想将这三个对象分开(即不要给o2或o3一个o1字段)。

+0

对于你需要什么样的问题,那样的初始化? –

+0

这是一个需要添加3个JPanel的JFrame,它们相互交互。 – L1ghtShadow

+1

先创建'JPanel's,然后在构建完成后放置属性。否则你无法避免循环。此外,你的构造函数名称('o1'等)必须与你的类名('Object1'等)匹配。你也应该遵循Java命名约定。 –

回答

1

你正面临着circular dependency ,你需要不惜一切代价避免。

对于您的燃眉之急你可以构造不采取依靠的对象,定义了一套方法,创建空的构造对象,然后通过传递对象的set方法将它们连接在一起。

public class test { 
     private Object1 o1; 
     private Object2 o2; 
     private Object3 o3; 

     public test() { 
      o1 = new Object1(); 
      o2 = new Object2(); 
      o3 = new Object3(); 

      o1.setO2(o2); 
      o1.setO3(o3); 

      o2.setO1(o1); 
      o3.setO1(o1); 

     } 
    } 
+0

哦,这是一个很好的解决方案,谢谢你。 – L1ghtShadow

0

此问题的简单解决方案是使用方法来启动而不是构造函数。
定义方法假设init &使用默认的构造函数或无参数的构造函数。现在创建所有对象&以正确的顺序调用所有对象的方法init

你可以在这里做一两件事。让我们来看看...
您可以用两个参数&定义方法,而不是一个参数的构造函数调用&从这两个参数的构造该方法定义构造函数。所有的
首先定义在Object2 & Object3init方法。的Object1构造..

Object1(Object2 o2, Object3 o3){ 
    //Some code 
    o2.init(this); 
    o3.init(this); 
    //Some code 
} 

现在你的代码来创建对象看起来像......

public class test { 
    private Object1 o1; 
    private Object2 o2; 
    private Object3 o3; 
    public test() { 
     o2 = new Object2(); 
     o3 = new Object3(); 
     o1 = new Object1(o2, o3); 
    } 
}