2012-01-16 6 views
1

私はC++でのポインタへのAAのポインタのようなものであるJavaでオブジェクトを宣言したいが、私はあなたに例を示しましょう:更新オブジェクトが更新されたオブジェクトへのすべての参照(リファレンスを参照)

//*** At the application startup 

//Initialize a settings container class 
Settings settings = //Load settings 

//Declaring static Application class that contain a reference to the settings container 
Application.setSettings(settings); 

//Get sub settings from settings container class 
DatabaseSettings dbSettings = settings.getDbSettings(); 
LogSettings logSettings = settings.getLogSettings(); 

//Initialize components 
DatabaseConnector dbConn = new DatabaseConnector(dbSettings); 
Logger logger = new Logger(logSettings); 

上記のコードでは、アプリケーションコンポーネントのすべての設定を含む設定コンテナクラスを作成した後、プログラムの実行中に関連コンポーネントに各サブ設定クラスを割り当てました。アプリケーションのコンポーネントに更新された設定を表示させます。たとえば、実行中に、このように設定コンテナを更新できます。

//Update settings through Application static class 
Settings newSettings = //assign updated settings 
Application.setSettings(newSettings); 

今の問題は、私は、実行時に設定コンテナを更新する際に、各サブセッティングインスタンスはそう、古いサブの設定を参照キープしながら、アプリケーションの静的クラスがnewSettingsインスタンスへの更新された参照が含まれているということです。

dbConn  ---> settings.getDbSettings() 
logSettings ---> settings.getLogSettings() 

私は二つの基準が自動的ので、設定の新しいインスタンスを参照することを希望しながら:

dbConn  ---> newSettings.getDbSettings() 
logSettings ---> newSettings.getLogSettings() 

をそれは、ポインタへのポインタのようなものです...それはJavaで可能ですか?どのようにそれを行うことができますか?

+0

同じオブジェクトを渡すと、メモリ内の同じオブジェクトを参照するため、事実上ポインタになります。 –

+1

シングルトンパターンを使用して、1つの設定オブジェクトまたはオブザーバーパターンを観察者(オブザーバー)に更新することを確実にすることです(設定クラス) –

+1

シングルトンパターンでも動作することは保証されません。 DatabaseConnectorとLoggerのコンストラクタは何をしますか?彼らが設定からフィールドをコピーする場合、あなたが設定を更新しても、それらのオブジェクトは決して変更を見ることはありません。その場合、唯一のオプションはオブザーバです。 – Hiro2k

答えて

2

Javaでは、オブジェクトへの参照のみがあります。参照を参照するには、何らかの間接参照が必要です。例えば

AtomicReference<DatabaseSettings> refDatabaseSettings = new AtomicReference<DatabaseSettings>(); 

refDatabaseSettings.set(dbSettings); 

DatabaseSettings dbSettings = refDatabaseSettings.get(); 

refを渡して1か所で変更できます。しかし、これは、変更された参照のいずれにも通知することはなく、次回の検査時にすべての参照が同じものを見ることを許可するだけです。

2

さて、アプリケーションで新しい設定を行う代わりに、既存の設定を更新してください。

これらの設定が変更される可能性があり、新しい設定を行うことに関心のあるコードは常にApplication.getSettings()を通過しなければならないという事実を文書化してください。

+0

+1最初の文は、私がこの質問に対する答えとして書くつもりだった。 –

0

あなたがしようとしていることを達成するには、何らかの通知システムを使用する必要があります。観察者/観察可能な、または変化に関心のあるリスナーを伴うイベントベースのシステムが、本当に唯一の方法です。

更新可能なスレッドセーフな設定オブジェクト(DatabaseSettingsなど)を作成することができます。そのため、オブジェクトのコンシューマは新しい値を取得しますが、これは最も単純な場合にのみ機能します。このアプローチの問題は、設定インスタンスへの複数の呼び出しの結果が矛盾してしまうことです。設定オブジェクトに複数の設定があると仮定すると、1つの設定が取得され、オブジェクトが更新され、次の設定が取得されると、2つの呼び出しが矛盾した(つまり、お互いに)値。例については

dbSettings.getConnectionUrl(); 
dbSettings.getUsername(); 

dbSettingsは、これらの2回の呼び出しの間に更新されている場合は、ユーザ名との接続は、もはや一致しません。

他の問題は、設定オブジェクトから特定の値を抽出して別の変数またはクラスに格納すると、変更されたことを知る方法がないということです。

これは、これらのクラスが非常に堅牢でエラーが発生しやすい方法を作ります。

関連する問題