ここから本文です

java.util.observableにあるnotifyobserversメソッド、引数なしと比べてobject型の...

tem********さん

2016/9/721:34:31

java.util.observableにあるnotifyobserversメソッド、引数なしと比べてobject型の引数のほうの違いはなんですか?

observerのupdateメソッドもobject型の引数を持つので関係あると思いますがjavadocを呼んでもよくわかりません。

閲覧数:
82
回答数:
2
お礼:
25枚

違反報告

ベストアンサーに選ばれた回答

2016/9/723:18:03

■実装を見れば違いがわかると思います。

--
public void notifyObservers() {
notifyObservers(null);
}
--
public void notifyObservers(Object arg) {
/*
* a temporary array buffer, used as a snapshot of the state of
* current Observers.
*/
Object[] arrLocal;

synchronized (this) {
/* We don't want the Observer doing callbacks into
* arbitrary code while holding its own Monitor.
* The code where we extract each Observable from
* the Vector and store the state of the Observer
* needs synchronization, but notifying observers
* does not (should not). The worst result of any
* potential race-condition here is that:
* 1) a newly-added Observer will miss a
* notification in progress
* 2) a recently unregistered Observer will be
* wrongly notified when it doesn't care
*/
if (!changed)
return;
arrLocal = obs.toArray();
clearChanged();
}

for (int i = arrLocal.length-1; i>=0; i--)
((Observer)arrLocal[i]).update(this, arg);
}
--

notifyObservers(Object arg)は
登録されたObserverに対して、update(Observable o, Object arg)を呼び出しています。

■以下テストコード
public class Yahooq10164015815 {

public static void main(String[] args) {

ObserverImpl observerImpl = new ObserverImpl();
ObservableEx observableEx = new ObservableEx();

observableEx.addObserver(observerImpl);

observableEx.test1();
observableEx.test2();

}

}

class ObserverImpl implements Observer {

@Override
public void update(Observable o, Object event) {
System.out.println("hello " + o);
System.out.println("event " + event);
}

}

class ObservableEx extends Observable {

public void test1() {
setChanged();
notifyObservers();
}

public void test2() {
setChanged();
notifyObservers("new event");
}

@Override
public String toString() {
return "Tarou";
}
}

  • 質問者

    tem********さん

    2016/9/800:55:46

    う~ん。observerにobservableがオブジェクトを渡せる、ということですか?ちなみにそれって実際のobservableのコードですか?それとも実装の再現?

  • その他の返信(3件)を表示

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

この回答は投票によってベストアンサーに選ばれました!

ベストアンサー以外の回答

1〜1件/1件中

agr********さん

2016/9/801:42:42

メソッドのサマリーしか見てないでしょ多分。実装なんて見なくても、おもいっきりAPIドキュメントに書いてあるぞ。

---public void notifyObservers()
このオブジェクトが変更された場合 (hasChanged メソッドで示される)、そのすべての Observer に通知してから、clearChanged メソッドを呼び出してこのオブジェクトがもう変更された状態でないことを示します。

各 Observer の update メソッドは、2 つの引数 (この Observable オブジェクトと null) で呼び出されます。つまり、このメソッドは次と同じになります。

notifyObservers(null)

--- public void notifyObservers(Object arg)
このオブジェクトが変更された場合 (hasChanged メソッドで示される)、そのすべての Observer に通知してから、clearChanged メソッドを呼び出してこのオブジェクトがもう変更された状態でないことを示します。

各 Observer の update メソッドは、2 つの引数 (この Observable オブジェクトと arg 引数) で呼び出されます。
---

単に update にそのオブジェクト(arg)がそのまま渡されるってだけの話。
値が更新されたことだけを Observer に通知したい時は、引数なしの notifyObservers でいいけど、更新前の値(あるいは更新後の値)がなんなのかを Observer 側で知りたい場合とかあるでしょ?そういう時にその値を渡したりするのに引数ありを使う。

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる