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()コンストラクターではなく、別のメソッドを使用して円を壊すことをお勧めします。たとえば、他のオブジェクトをクラスの1つに追加します。そのメソッドが呼び出されていない場合は、不正なオブジェクトの状態を回避するために、いくつかのチェックを追加するだけで済みます。

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オブジェクトの親になります...

于 2012-12-10T21:55:16.127 に答える
1

以前、オブジェクトが相互に参照し合っていました。つまり、ゲームでは、オブジェクトにそのセルへの参照が含まれている場合があり、セルにはオブジェクトへの参照が含まれている場合があります。

オブジェクトの作成方法に注意する必要があります。

両方をお互いのコンストラクターに渡す必要があるとは何も言われていません。実際、両方のオブジェクトを作成してから、別のメソッドでお互いを参照させることができます。

また、値を使用する前に値がnullであるかどうかを確認することも珍しくありません(ただし、これは、値が実際にnullになる言い訳がある場合にのみ実行してください)。

于 2012-12-10T21:56:12.570 に答える
1

Mmn ..できることは、ツールバーとWebPanelをラップするモデルオブジェクトを作成することです。

public class SomeModel{
  WebPanel panel;
  Toolbar toolbar;
}

または、ツールバーオブジェクトを作成することもできます。ツールバーのコンストラクターでWebパネルを作成します。

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

lmaoをだましていたのはわかりました。あるオブジェクトが別のオブジェクトの複合オブジェクトであるかどうかによって異なります。モデルの方法の方が良いと思いますが..循環参照はありません。

于 2012-12-10T21:57:06.857 に答える
0

それを行うには複数の方法があります。私は通常、2つのパラメータの一方にパラメータを渡し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 に答える
0

たぶんあなたが最初に宣言した場合

WebPanel webPanel = new WebPanel(myToolBar);

その後

ToolBar myToolBar = new ToolBar(webPanel);

渡されるには、オブジェクトが最初に存在する必要があります。

于 2012-12-10T21:59:16.270 に答える