状況: メイン フォームは、特定のクラスのインスタンスを作成または変更するためにユーザーがパラメーターを入力するテキスト ボックスを含むモーダル jDialog を呼び出します。これを ClassA と呼びます。
ダイアログが既存のインスタンスを変更する必要がある場合、コンストラクターにパラメーターとして渡されます。それ以外の場合、jDialog は ClassA の新しいインスタンスを作成します。
問題: メインフォームはその新しいインスタンスにアクセスする必要があり、メインフォーム全体をパラメーターとして渡し、メソッド呼び出しによってダイアログに新しいインスタンスをプッシュさせるのはクリーンなコードではないと思います。使用可能なスタンドアロン ダイアログは、新しいインスタンスを受け取るために特定のクラス名とメソッドを必要とする 1 つのメイン フォームでのみ使用可能になります。
[OK] ボタンがクリックされた後にメイン フォームが jdialog から新しいインスタンスを取得するようにする方がはるかに論理的です。 getClassAInstance() メソッド (既存のインスタンスが変更されたときにも呼び出すことができます) を呼び出します。このメソッドは、問題の jdialog の新しいインスタンスで「setVisible(true)」メソッドの後に呼び出されます。ダイアログが表示されます。メイン フォームのスレッドは、ダイアログが閉じられるまでスリープ状態になります (モーダルであるため)。[OK] ボタンは jDialog の dispose() メソッドを呼び出し、その次のステートメントは、メインフォームによる jDialog の getClassAInstance() 呼び出しです。
これはコードで同じことです..
ClassAInstanceMakerDialog imd = new ClassAInstanceMakerDialog(this, true);
imd.setVisible(true);
//imd.dispose(); after OK button click
System.out.println(imd.getClassAInstance()); //return a new ClassA instance
//output: whatever ClassA.toString() should return, works fine
質問: 試してみましたが、問題なく動作するようです。しかし、それは良いコードですか?jDialog が破棄された後、メイン フォームが呼び出しを完了する前にガベージ コレクタが ClassA インスタンスを収集したため、getClassAInstance() メソッドが「null」を返す危険性はありますか?
私は英語のネイティブ スピーカーではありません。コードを見たい場合は、お知らせください...