2

晚上大家。

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

例如,看下面的例子:

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

但是,在构造 ToolBar 时,它会返回 NullPointerException。当然那是因为 webPanel 还没有构建,它需要它。

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

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

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

4

6 回答 6

3

如您所见,这将导致问题。除了这种方法,您可以使用 setter-getter 方法方法,在该方法中使用默认构造函数构造对象,例如

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

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

myToolBar.setWebPanel(webPanel);
webPanel.setToolBar(myToolBar);
于 2012-12-10T21:56:53.473 回答
2

这似乎是恶性循环的一个很好的例子。

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

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

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

于 2012-12-10T21:55:16.127 回答
1

我以前有对象相互引用。即在游戏中,对象可能包含对其单元格的引用,而单元格可以包含对对象的引用。

你只需要小心你如何创建你的对象。

没有什么说它们都必须传递给彼此的构造函数,实际上您可以创建两个对象,然后以不同的方法让它们相互引用。

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

于 2012-12-10T21:56:12.570 回答
1

嗯.. 你可以做的是创建一个模型对象,它环绕你的工具栏和 WebPanel。

public class SomeModel{
  WebPanel panel;
  Toolbar toolbar;
}

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

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

好吧,那是在作弊 lmao 这取决于一个是否是另一个的复合对象;虽然我认为模型方式更好..没有循环引用。

于 2012-12-10T21:57:06.857 回答
0

也许如果你先声明

WebPanel webPanel = new WebPanel(myToolBar);

接着

ToolBar myToolBar = new ToolBar(webPanel);

对象必须首先存在才能被传递。

于 2012-12-10T21:59:16.270 回答
0

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

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

class WebPanel {
  WebPanel(ToolBar t) {
    _t = t;
    _t.setWebPanel(this);
  }
}
于 2012-12-10T22:03:09.063 回答