最近、Java のObservableクラスについて読みました。私が理解していないのは、オブザーバーに通知する前に (notifyObservers())、setChanged() を呼び出さなければならないということです。setChanged を呼び出す必要がある notifyObservers メソッド内にブール値があります。ブール値の目的は何ですか? setChanged() を呼び出す必要があるのはなぜですか?
5 に答える
長い治療では、setChanged()を数回呼び出すことができますが、最後にnotifyObservers()を 1 回だけ呼び出します。終了前に、内部的な理由でロールバックすることにした場合は、 clearChanged()を呼び出すことを選択できます。後者の場合、notifyObservers()は効果がありません。
setChanged()
この Observable オブジェクトを変更済みとしてマークします。hasChanged メソッドは true を返すようになりました。
notifyObservers()
hasChanged メソッドによって示されるように、このオブジェクトが変更された場合は、すべてのオブザーバーに通知してから、clearChanged メソッドを呼び出して、このオブジェクトが変更されていないことを示します。
基本的にsetChanged()
、変更が発生したことをオブザーバーのスーパークラスに通知するために使用します。次に、メソッドを呼び出して起動notifyObservers()
し、オブザーバーに何が変更されたかを伝えます。
を呼び出してオブザーバーに通知する前に、クラスが変更を元に戻すことができるため、そこに setChanged() がありますclearChanged()
。setChanged() フラグを設定しなかった場合は、本質的にオブザーバーに通知しており、変更が検出されないため、「通知」に応答しません。
詳細については、私のコードを参照してください。
Main メソッド public class SpeedRunner {
public static void main(String[] args) {
SpeedMonitor monitor = new SpeedMonitor();
// Create a speedometer and register the monitor to it...
SpedoMeter speedo = new SpedoMeter();
speedo.addObserver(monitor);
// Drive at different speeds...
speedo.setCurrentSpeed(50);
speedo.setCurrentSpeed(70);
speedo.setCurrentSpeed(40);
speedo.setCurrentSpeed(100);
speedo.setCurrentSpeed(69);
}
オブザーバー (興味深いことが起こったときに通知されるオブジェクト):
//this is the observer since it is observing changes in the speedo.
public class SpeedMonitor implements Observer {
public static final int SPEED_TO_ALERT = 70;
public void update(Observable obs, Object obj) {
SpedoMeter speedo = (SpedoMeter) obs;
if (speedo.getCurrentSpeed() > SPEED_TO_ALERT) {
System.out.println("** ALERT ** Driving too fast! (" + speedo.getCurrentSpeed() + ")");
} else {
System.out.println("... nice and steady ... (" +
speedo.getCurrentSpeed() + ")");
}
}
}
主題(興味のある対象)
public class SpedoMeter extends Observable{
private int currentSpeed;
public SpedoMeter(){
currentSpeed = 0;
}
public void setCurrentSpeed(int speed){
currentSpeed = speed;
// setChanged();
notifyObservers();
}
public int getCurrentSpeed() {
return currentSpeed;
}
}
setChanged() をコメントアウトすると、オブザーバーによって何も検出されないため、コンソールが空になります。
この教科書を見てください。デザインパターンを学ぶのは本当に良いことです。
ビービス、トニー。Java Design Pattern Essentials (Kindle Location 1835)。アビリティファーストリミテッド。キンドル版。
理由としては、 setChanged() に保護された修飾子がある可能性があります。一方、notifyObservers() は、オブザーバーであっても、どこでも呼び出すことができます。それ以来、オブザーバブルとオブザーバーはこのメカニズムで相互作用する可能性があります。
setchanged() は、状態を変更するための指示またはフラグとして使用されます。true の場合、notifyObservers() を実行してすべてのオブザーバーを更新できます。 false の場合、notifyObservers() は setchanged() を呼び出さずに呼び出され、オブザーバーには通知されません。