3

クラスのインスタンスを別のクラスのコンストラクターに渡そうとしていますが、その逆も同様です。私はこれをしたいと思います:

static Map map = new Map(hero);
static Hero hero = new Hero(map);

このコードを Game クラス内で実行しています。上記のコードを正しく実装するにはどうすればよいですか? それについてもっと良い方法はありますか?

編集:

私が本当に欲しいのは遅延読み込みだと思います。たとえば、マップが null の場合はそれを作成します。それ以外の場合は、作成しないでください。Javaでこれを行うにはどうすればよいですか?

4

5 に答える 5

4

上記の構文はコンパイルされず、illegal forward referenceコンパイル エラーが発生します。

できることは、2 つのオブジェクトを作成してから、参照を設定することです。

static Map map = new Map();
static Hero hero = new Hero();
// and then ...
map.hero(hero);
hero.map(map);

もちろん、セッターに名前を付ける方法は自由です。これらが真の Java Bean セッターのように動作する場合は、おそらくその命名規則 (つまりsetX()getX()) に固執する必要があります。そのセッターを使用する前にMap\ class が使用できない場合は、おそらくBuilder Design Patternの場合です。Hero

別のオプションは、上記のことを舞台裏で処理する依存性注入ライブラリを使用することです。

3 番目のオプションは、ネストされたクラスを使用することです (設計に適合する場合)。

class Map {
    class Hero { ... }
}

このようにして、すべてのヒーローはMap経由で利用可能な参照を持っていますMap.this

HTH、
エルメス

于 2012-10-20T12:41:21.163 に答える
4

おそらく、2段階の初期化を介して行うでしょう。

例えば

static Map map = new Map();
static Hero hero = new Hero();

map.setHero(hero);
hero.setMap(map);

次に、関連する関数にガードを追加して、 setMap / setHeroの前に呼び出された場合に「完全に初期化されていない」例外をスローします

于 2012-10-20T12:36:03.447 に答える
0

基本的に、他のクラスの内部に World クラスを作成することはなく、必要に応じて World クラスが他のクラスをインスタンス化するように作成しました。

助けてくれてありがとう。

于 2012-12-06T21:19:04.187 に答える