以下は、現在のコードの簡略版です。私は構文的に間違ったことをしていないと確信しており、概念的な間違いを見つけることができません。
これは、私が実装しようとした一種のオブザーバー パターンです。私のクラスはすでに複雑で、別のクラスから継承しているため、Java.utils.observable から継承する余裕はありませんでした。ここには 2 つの部分があります。
Runnable を実装する Notifier クラスがあります。
public class Notifier implements Runnable{
public void run()
{
while(true)
{
MyDataType data = getData();
if(data.isChanged()==true)
{
refresh();
}
}
}
}
そして、MyDataType データへの変更に応答する必要があるメイン クラスがあります。
public class abc {
private MyDataType data;
public void abc(){
Notifier notifier = new Notifier();
Thread thread = new Thread(notifier);
thread.start();
}
public MyDataType getData(){
return this.data;
}
public void refresh(){
MyDatatype data = getData();
//Do something with data
}
}
問題: 何が起こっているかというと、「データ」が変更されたときに通知機能が refresh() を呼び出していることです。ただし、refresh() 内で getData() を実行すると、古いバージョンの「データ」が取得されます。refresh() 関数を呼び出しているコードの他の部分もあることに注意してください。
- 私は何を見落としていますか?
- この問題に対する他のより良い解決策はありますか?
- デフォルトの Java 実装をすぐに適用できない場合、Subject-Observer システムの設計にどのようにアプローチすればよいですか?