javaのコンストラクターからインスタンス化オブジェクトを取得するにはどうすればよいですか?
イベントバブリング(親ハンドラーの呼び出し)をシミュレートするために、いくつかのGUIクラスの親オブジェクトへの参照を保存したいのですが、既存のすべてのコードを変更したくありません。
javaのコンストラクターからインスタンス化オブジェクトを取得するにはどうすればよいですか?
イベントバブリング(親ハンドラーの呼び出し)をシミュレートするために、いくつかのGUIクラスの親オブジェクトへの参照を保存したいのですが、既存のすべてのコードを変更したくありません。
簡単な答え:Javaでこれを行う方法はありません。(あなたはどのクラスがあなたを呼んだかを知ることができますが、以下の長い答えはほとんどの部分にも当てはまります。)
長い答え:呼び出し元によって魔法のように動作が異なるコードは、ほとんどの場合、悪い考えです。コードを維持しなければならない人にとっては混乱を招き、リファクタリングの能力を著しく損ないます。たとえば、オブジェクトをインスタンス化する2つの場所が基本的に同じロジックを持っていることに気付いたとします。そのため、共通ビットを除外することにします。サプライズ!これで、他の場所からインスタンス化されているため、コードの動作が異なります。パラメータを追加して、発信者を修正するだけです。長期的には時間を節約できます。
呼び出し元のクラスを知りたい場合は、「this」をパラメーターとしてコンストラクターに渡します。
Thing thing = new Thing(this);
編集:リファクタリングを可能にする最新のIDEを使用すると、これを非常に簡単に行うことができます。
大量の既存のコードを変更せずにメソッド呼び出し(コンストラクターを含む)をインターセプトすることは、アスペクト指向プログラミングのために作られたことの1つです。
まずはAspectJをチェックしてください。
AspectJを使用すると、特定のオブジェクトまたはオブジェクトのセットに対するコンストラクター呼び出しをインターセプトすることを指定する「ポイントカット」を定義でき(必要に応じてワイルドカードを使用)、インターセプトコード(「アドバイス」)内に次の情報が提供されます。メソッドコンテキスト。呼び出し元のメソッドとオブジェクトの両方に関する情報が含まれます。
AspectJを使用して、オブジェクトにフィールドを追加し、既存のコードを変更せずに親参照を格納することもできます(これは「紹介」と呼ばれます)。