JavaDoc 読解~java.util.Observableクラスの使い方~

java.util.Observableクラス

このクラスは、Observerインターフェースと併用するようにできています。デザインパターンの「Observerパターン」です。

処理の概要

Observableクラスに登録されたObserverクラス(Observerインターフェースをimplementsしたクラス)のupdateメソッドを
変更の通知があったときに呼び出す。

実装してみた

Observableクラスにメインメソッドを実装しました。はじめはObserverクラスに何かしらの変更があったときにupdate処理が走るのかと思ったのですが
次のメソッドが動いたときに走るようです。

Observable#setChanged()とObservable#notifyObservers()を呼び出すとObserverクラスのupdateが起動します。

Observableを継承して作る

import java.util.Observable;
import java.util.function.Function;

public class ObserverSample extends Observable {
    /** 引数String, 返却値Stringのメソッド */
    private Function<String, String> func;

    public ObserverSample(Function fun) {
        this.func = fun;
    }

    public void execute(String str) {
        System.out.println(func.apply(str));
    }

    public static void main(String[] ags) {
        // Functionに意味はないです。実装したときの残骸です。。。
        ObserverSample sample = new ObserverSample(str -> {
            return "aaa: " + str;
        });

        ChildOverver ovs = new ChildOverver("aaa");
        ChildOverver ovs1 = new ChildOverver("bbb");
        ChildOverver ovs2 = new ChildOverver("ccc");
        sample.addObserver(ovs);
        sample.addObserver(ovs1);
        sample.addObserver(ovs2);

        sample.setChanged();
        sample.notifyObservers();
        System.out.println("^^^^^^^^^^^^^^^^^^^^");
        sample.setChanged();
        sample.notifyObservers("pppppp");
    }
}

Observerクラス

import java.util.Observable;
import java.util.Observer;

public class ChildOverver implements Observer {
    private String str;
    public ChildOverver(String str) {
        this.str = str;
    }
    @Override
    public void update(Observable o, Object arg) {
        System.out.println("Param is " + str);
        System.out.println("Count: " + o.countObservers());
        System.out.println("arg: " + arg);
    }

    public void setStr(String newStr) {
        this.str = newStr;
    }
}

プログラムの実行結果

Param is ccc
Count: 3
arg: null
Param is bbb
Count: 3
arg: null
Param is aaa
Count: 3
arg: null
^^^^^^^^^^^^^^^^^^^^
Param is ccc
Count: 3
arg: pppppp
Param is bbb
Count: 3
arg: pppppp
Param is aaa
Count: 3
arg: pppppp

投稿者:

takunoji

音響、イベント会場設営業界からIT業界へ転身。現在はJava屋としてサラリーマンをやっている。自称ガテン系プログラマー(笑) Javaプログラミングを布教したい、ラスパイとJavaの相性が良いことに気が付く。 Spring framework, Struts, Seaser, Hibernate, Playframework, JavaEE6, JavaEE7などの現場経験あり。 SQL, VBA, PL/SQL, コマンドプロント, Shellなどもやります。

コメントを残す