1

Warehouse クラスがあるとします。そのウェアハウスには TradeDesk があります。その TradeDesk は、Warehouse で設定されたインスタンス変数に基づいて、販売可能なアイテムを計算します。Warehouse のコンストラクターは TradeDesk をインスタンス化しますが、TradeDesk は不完全に初期化された Warehouse からのインスタンス変数を必要とするため、問題があります。複数のコンストラクターを介してインスタンス値を渡すことを除いて (これは避けたいと思います。以下の例は大幅に簡略化されていることに注意してください)、どうすればこれを解決できますか? ありがとう!

public class Warehouse {
    TradingDesk td;
    public int val;

    public Warehouse() {
        val = 3;
        td = new TradingDesk(this);
    }
// New class
public class TradingDesk {
    Warehouse associatedWh;
    int val;
    public TradingDesk(Warehouse wh) {
        associatedWh = wh;
        val = associatedWh.val;
    }
}

}

4

3 に答える 3

1

内部クラスのコードに関してWarehouseは、外部クラスのインスタンスでフィールドを初期化しようとしています。したがって、コードは次のようになります。

public class Warehouse {
    private TradingDesk td = new TradingDesk();
    private int val = 3;

    class TradingDesk {
         // you have already access to the outer Warehouse class including its fields
    }
}

実際、内部クラスは外部クラスのすべてのプロパティにアクセスできます。だからあなたの問題は消えます。

編集 - - - - - - - - -

ここで、循環依存関係に対処するための私の解決策:

public class Warehouse {
    private TradingDesk td = new TradingDesk();
    private int val = 3;

    public int getVal(){ //so accessible through TradingDesk object
        return val;
    }

    public void associateWhToTd(){
        td.setAssociatedWh(this); // no issue here since "this" is fully already created
    }

    public static void main(String[]args){ // example of usage
        Warehouse wh = new Warehouse();
        wh.associateWhToTd();
    }
}

public class TradingDesk {
    Warehouse associatedWh;

    public void setAssociatedWh(Warehouse wh){
       this.associatedWh = wh;
    }
}
于 2012-10-31T01:36:06.057 に答える
1

TradingDeskの内部クラスを作成できますWareHouseWareHouseこのようにして、パラメーターを渡す必要なく、それを囲むインスタンス変数に直接アクセスでき、インスタンスのコンテキスト内でのみそのインスタンスを作成できWareHouseます。

public class Warehouse {

    private int val;
    private TradingDesk td;

    public Warehouse() {
        this.val = 3;
        this.td = new TradingDesk();
    }

    public class TradingDesk {

        public TradingDesk() {
            //this is the right way to access the enclosing instance
           if(WareHouse.this.val==3){
               //do something
           }
        }

        public WareHouse getAssociatedWareHouse(){
           return WareHouse.this;
        }
    }
}
于 2012-10-31T01:37:35.817 に答える
0

遅延インスタンス化された子オブジェクトを使用できます。

class Warehouse {
  private TradingDesk td;
  ...

  public Warehouse() {
    ...
  }

  public TradingDesk getTradingDesk() {
    if (td == null) td = new TradingDesk(this);
    return td;
  }
}

上記のゲッターはスレッドセーフではないことに注意してください。

this工事中は逃げるな

于 2012-10-31T01:46:11.623 に答える