8

私はかなり大きなSwingJavaアプレットを開発するチームの一員です。私たちのコードのほとんどはレガシーであり、シングルトン参照がたくさんあります。それらすべてを単一の「アプリケーションコンテキスト」シングルトンにまとめました。ここで必要なのは、共有コンテキスト(現在表示されているすべてのアプレットで共有されている)と非共有コンテキスト(現在表示されている各アプレットに固有)を分離する方法を作成することです。

ただし、シングルトンを呼び出す各場所にIDはありません。また、IDをすべての場所に伝播する必要もありません。実行しているアプレットコンテキストを特定する最も簡単な方法は何ですか?(クラスローダー、スレッドグループ、スレッドIDをいじってみました...これまでのところ、呼び出しの発信元を特定できるものは何も見つかりませんでした)。

4

3 に答える 3

3

シングルトンは悪です。何を期待しますか? ;)

おそらく、最も包括的なアプローチは、アプレットの大部分を別のクラス ローダーにロードすることです (java.net.URLClassLoader.newInstance を使用します)。次に、WeakHashMap を使用して、クラス ローダーをアプレットに関連付けます。ほとんどのコードを共通のクラス ローダー (各アプレット クラス ローダーの親として) と通常のアプレット コードベースに分割できれば、処理は速くなりますが、作業量は多くなります。

その他のハック:

いずれかのコンポーネントにアクセスできる場合は、Component.getParent または SwingUtilities.getRoot を繰り返し使用できます。

アプレットごとのインスタンス スレッドを使用している場合は、ThreadLocal を設定できます。

EDT から、キュー (java.awt.EventQueue.getCurrentEvent()) から現在のイベントを読み取ることができ、そこからコンポーネントを見つけることができます。または、オーバーライドされた dispatchEvent メソッドを使用して EventQueue をプッシュします。

于 2008-09-05T21:13:10.303 に答える
0

私があなたを正しく理解しているなら、アイデアは、呼び出し元オブジェクトまたは「コンテキスト」ごとに異なる「シングルトン」オブジェクトを取得することです。実行できることの1つは、現在のコンテキストのIDを書き込むスレッドローカルグローバル変数を作成することです。(これはAOPで実行できます。)次に、シングルトンゲッターで、コンテキストIDがスレッドローカルからフェッチされ、呼び出し元のコンテキストの正しい「シングルトン」インスタンスへのキーとして使用されます。

AOPに関しては、ポイントカットに応じて、コンパイル時にアドバイスが織り込まれ、実行時の依存関係にJARが追加されるため、アプレットでの使用に問題はありません。したがって、実行時にAOPの特別な証拠を残してはなりません。

于 2008-08-11T12:32:02.480 に答える
0

スレッドローカルに関する@Hugo:

私はその解決策について考えました。ただし、実験から、そのアプローチには2つの問題が見つかりました。

  1. 共有スレッド(サーバー接続など)には問題があります。ただし、これらのスレッドに特別な注意を払うことで、これを解決できます(これらはすべて私の制御下にあり、レガシーコードからほとんど分離されています)。
  2. EDTスレッドは、すべてのアプレットで共有されます。アプレットごとに新しいEDTスレッドを強制的に作成する方法を見つけることができませんでした。これは、EDTのスレッドローカルがアプレット間で共有されることを意味します。これはどうやって解決したらいいのかわからない。提案?
于 2008-08-11T20:06:28.070 に答える