OnPreferenceChangeListener.onPreferenceChange




Androidプログラミングにおいて、設定画面を作成する方法の一つとしてPreferenceActivityを使う方法がある。
その中で、設定が変わったことを検知するにはOnPreferenceChangeListener.onPreferenceChangeメソッドを定義する。

CheckBoxPreference checkPref = (CheckBoxPreference)
    findPreference(getString(R.string.property_enable));
checkPref.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
    public boolean onPreferenceChange(Preference p, Object newValue) {
        enabled = (Boolean) newValue;
        return true;
    }
});

onPreferenceChangeの第一引数”Preference p”には変更前のPreferenceが格納されており、このメソッドを”true”で抜けた時に第二引数”Object newValue”で書き換えられる。”false”で抜けた時は、値は変更されない


Singletonクラス設計




Got my homework back...Got my homework back… / scottfeldstein

 

いくつか落とし穴がありそうだったのでメモしておく。
参考:
http://www.atmarkit.co.jp/fjava/javatips/075java007.html
http://www.ibm.com/developerworks/java/library/j-dcl/index.html

@ITによると、

Singletonパターンのポイントは、「コンストラクタをprivateにしてしまう」ことです。そして、唯一のインスタンスをprivateなstatic変数として保持しておくのです。こうすることで、そのクラスがJava仮想マシンへロードされたときに、一度だけインスタンスが生成されます。そして、これ以後、インスタンスの生成は構造上不可能になります。インスタンスの取得には、専用のstaticメソッドを用意します。

とのことだが、この場合、コンストラクタに動的な引数を与えることができない。
*具体的には、AndroidのContextをコンストラクタに渡したいケースとか

となると、GoFパターンをベースにすることになるのだが、マルチスレッド時に問題があるらしい。結局のところ、Synchronizedを使ってしまうのが手っ取り早い。当然、パフォーマンスが問題になるようなケースでは使えないが。