-4

スタック オーバーフロー エラーをスローする Java プログラムに問題があり、この問題は 2 つのクラス ファイルが相互に参照されていることに関係していると判断しました。たとえば、クラス 1 には行 two two = new two(); があり、クラス 2 には行 one one = new one(); があります。これらのクラスがメソッドを共有できるようにする必要があります。これが、やりたいことを実行できる唯一の方法です。再帰によってスタック オーバーフローの問題が発生することなく、2 つのクラスが相互に参照できるようにするにはどうすればよいですか?

4

1 に答える 1

2

あなたはこのようなことをしています、私は推測しています:

class A {
  private B b = new B();

}

class B {
  private A a = new A();

}

これを行うと、A は新しい B インスタンスを作成し、新しい A インスタンスが作成され、新しい B インスタンスが作成され、新しい A インスタンスが作成され、新しい B インスタンスが作成され、新しい A インスタンスが作成され、新しい B インスタンスが作成されます。次に、新しい B インスタンスを作成します。これは ....

これは再帰的な悪夢を引き起こします。

解決策: 新しいオブジェクトを再帰的に作成しないでください。代わりに、setter メソッドを介して、あるオブジェクトの参照を別のオブジェクトに渡します。例えば...

class A {
  private B b;

  public void setB(B b) {
    this.b = b;
  } 
}

class B {
  private A a;

  public void setA(A a) {
    this.a = a;
  } 
}

メインコード

public static void main(String[] args) {
   A a = new A();
   B b = new B();

   b.setA(a);
   a.setB(b);
}

または、Guice で実行できるような依存性注入を使用することをお勧めします (ただし、このツールを使用して相互に参照するオブジェクトを作成できるかどうかはわかりません)。最初にチェックせずに a または b 変数を使用して、それらが null でないことを確認してください。

余談ですが、プログラムの設計によって A クラスと B クラスが密結合することになるため、オブザーバー パターンなど、この結合を減らす設計パターンの使用を検討する必要があります。


あなたの状態を編集
:

このコードが何をするのかわかりません。よりよく理解できるように、少しコメントしていただけますか?このコードを使用して他のクラスのメソッドを使用するにはどうすればよいですか?

コードの最初のビットは、あなたが現在行っていると思われるものです (コードを表示していないため、確かなことはわかりません)。私のメモによると、これにより、スタックオーバーフローが発生するまでコードが永久に実行されます。 . 2 番目のコードでは、他のクラスのインスタンスを作成する各クラス内のコードを削除します。代わりに、クラス参照を設定するセッター メソッドがあります。ゲッター メソッドとセッター メソッド (ミューテーター メソッドとアクセサー メソッドとも呼ばれます) に慣れていない場合は、Java で頻繁に使用されるため、このテーマに関するチュートリアルを見つけて確認することをお勧めします。簡単に言えば、クラス A には、setB(B b)外部クラスが完全に作成された B オブジェクトを A オブジェクトに渡すことができるメソッドがあります。したがって、A が新しいB オブジェクトを作成するのではなく、外部クラスが既に作成されたオブジェクトを渡すことができます。Bオブジェクトが入っているので、再発しません。クラス B コードについても同様です。

于 2013-08-14T21:52:42.673 に答える