Java:将相同的对象传递给彼此的构造函数

时间:2012-12-10 21:52:26

标签: java object constructor nullpointerexception

大家晚上。

在尝试将对象传递给另一个对象构造函数时,我似乎遇到了一个奇怪的问题,构造函数也依赖于它传递给的对象。

例如,举个例子:

ToolBar myToolBar = new ToolBar(webPanel);
WebPanel webPanel = new WebPanel(myToolBar);

然而,在构造ToolBar时,它返回NullPointerException。当然,因为webPanel尚未构建而且需要它。

减速和初始化必须保持在同一个类(称为BuildUI)中,因为它是我设置属性的地方。 (ToolBar创建webPanel对象也没有意义,反之亦然。)

我也不确定这是不是很好的编程习惯,因为两个对象都需要相互引用。

非常感谢任何建议。谢谢,汤姆。

6 个答案:

答案 0 :(得分:3)

如您所见,这将导致问题。您可以使用setter-getter方法,而不是使用此方法,您可以使用默认构造函数(如

)构造对象。
ToolBar myToolBar = new ToolBar();
WebPanel webPanel = new WebPanel();

然后使用setter方法设置完全构造对象所需的实例变量。

myToolBar.setWebPanel(webPanel);
webPanel.setToolBar(myToolBar);

答案 1 :(得分:2)

这似乎是vicious circle的一个很好的例子。

我建议使用单独的方法打破圆圈,例如: addToolbar(),将另一个对象添加到其中一个类中,而不是构造函数。如果没有调用该方法,您只需要添加一些检查以避免非法对象状态:

class WebPanel {
    public void addToolbar(Toolbar toolbar) {
        ...
    }
}
...
class ToolBar {
     public ToolBar(WebPanel parent) {
         ...
     }
}
...
WebPanel webpanel = new WebPanel();
webpanel.addToolbar(new Toolbar(webpanel));

通常,“子”对象最好将父对象作为构造函数参数,然后通过方法调用添加到父对象,而不是相反。在UI中,外部元素是其内容的父元素 - 在您的情况下,我可能希望WebPanel包含 - 并因此成为ToolBar对象的父元素...

答案 2 :(得分:1)

我之前有过对象引用。即在游戏中,对象可能包含对其单元格的引用,并且单元格可以包含对该对象的引用。

您必须小心如何创建对象。

没有什么说它们必须被传递到每个其他构造函数中,事实上你可以创建两个对象,然后用不同的方法让它们互相引用。

在使用它之前检查一个值是否为空也不是一种不常见的做法(但只有这样,这个值实际上有一个借口永远为null。)

答案 3 :(得分:1)

Mmn ..您可以做的是创建一个包裹工具栏和WebPanel的模型对象。

public class SomeModel{
  WebPanel panel;
  Toolbar toolbar;
}

或者您可以创建工具栏对象..并在工具栏的构造函数中创建您的webpanel

public WebPanel()
{
   this.toolbar= new Toolbar(this); 
}
webPanel = new WebPanel();
webPanel.getToolbar() ;

好的,这是在欺骗lmao 这取决于一个人是否是另一个人的复合对象;虽然我认为Model方式更好..没有循环引用。

答案 4 :(得分:0)

也许你先声明

WebPanel webPanel = new WebPanel(myToolBar);

然后

ToolBar myToolBar = new ToolBar(webPanel);

首先要传递的对象必须存在。

答案 5 :(得分:0)

有多种方法可以做到;我通常更喜欢将参数传递给其中一个并让它在另一个中调用setter方法:

class ToolBar {
  void setWebPanel(WebPanel wp) { 
    _wp = wp; 
  }
  ....
}

class WebPanel {
  WebPanel(ToolBar t) {
    _t = t;
    _t.setWebPanel(this);
  }
}