27

最近、Java のObservableクラスについて読みました。私が理解していないのは、オブザーバーに通知する前に (notifyObservers())、setChanged() を呼び出さなければならないということです。setChanged を呼び出す必要がある notifyObservers メソッド内にブール値があります。ブール値の目的は何ですか? setChanged() を呼び出す必要があるのはなぜですか?

4

5 に答える 5

29

長い治療では、setChanged()を数回呼び出すことができますが、最後にnotifyObservers()を 1 回だけ呼び出します。終了前に、内部的な理由でロールバックすることにした場合は、 clearChanged()を呼び出すことを選択できます。後者の場合、notifyObservers()は効果がありません。

于 2013-02-27T19:56:43.363 に答える
3

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)。アビリティファーストリミテッド。キンドル版。

于 2018-04-09T20:17:37.717 に答える
1

理由としては、 setChanged() に保護された修飾子がある可能性があります。一方、notifyObservers() は、オブザーバーであっても、どこでも呼び出すことができます。それ以来、オブザーバブルとオブザーバーはこのメカニズムで相互作用する可能性があります。

于 2015-05-21T12:48:17.827 に答える
1

setchanged() は、状態を変更するための指示またはフラグとして使用されます。true の場合、notifyObservers() を実行してすべてのオブザーバーを更新できます。 false の場合、notifyObservers() は setchanged() を呼び出さずに呼び出され、オブザーバーには通知されません。

于 2014-10-24T13:53:19.327 に答える