Java的:传递相同的对象到每个人的构造(Java: Passing the same object

2019-07-04 21:28发布

大家晚上。

我似乎试图将对象传递到另一个对象的构造是谁的构造也依赖它被传递到物体上时,击中一个奇怪的问题。

例如,采取下面的例子:

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

然而构建工具栏当它返回一个NullPointerException异常。 Ofcourse这是因为webPanel尚未建立,它需要它。

无论是减速和初始化必须保持在同一类(称为BuildUI),因为它是在哪里设置的属性。 (它也没有意义了工具栏,创建webPanel对象,反之亦然)。

我也不知道这是连良好的编程习惯,因为这两个对象需要互相引用。

这里任何意见是非常赞赏。 谢谢你,汤姆。

Answer 1:

这将导致问题,因为你可以看到。 相反,这种方法的,可以使用setter方法的getter方法的方法,你构造对象有一个默认的构造如

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

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

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


Answer 2:

This seems like a nice example for a vicious circle.

I would suggest breaking the circle by using a separate method, e.g. addToolbar(), to add the other object to one of the classes, rather than a constructor. You would only need to add a few checks to avoid illegal object states, if that method has not been called:

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

In general, it is preferred for "child" objects to take the parent object as a constructor argument and then be added to the parent via a method call, rather than the other way around. In a UI the outer elements are parents to their contents - in your case I would probably expect a WebPanel to contain - and thus be a parent of - a ToolBar object...



Answer 3:

我已经有对象之前引用的每其他。 即游戏中的对象可能包含它的单元格的引用,并且该电池可以包含对对象的引用。

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

没有说,他们必须都被传递到每个-其他构造,在-其实你可以在不同的方法创建两个对象,然后,让他们相互引用,其他。

它也并非罕见的做法,以检查是否值在使用它之前是空的(但仅做到这一点是值实际上有一个借口,永远是零。)



Answer 4:

MMN ..你可以做的就是创建一个工具栏和WebPanel周围包装了一个模型对象。

public class SomeModel{
  WebPanel panel;
  Toolbar toolbar;
}

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

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

确定这是欺骗LMAO这取决于一个是否是另一个复合对象; 虽然我认为模型的方式是更好的..没有循环引用。



Answer 5:

也许如果你先申报

WebPanel webPanel = new WebPanel(myToolBar);

然后

ToolBar myToolBar = new ToolBar(webPanel);

该对象必须存在先被通过。



Answer 6:

有多种方法可以做到这一点; 我平时比较喜欢的参数传递给两个中的一个,并把它称之为一个setter的另一种方法:

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

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


文章来源: Java: Passing the same objects to each others constructor