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を使ってしまうのが手っ取り早い。当然、パフォーマンスが問題になるようなケースでは使えないが。