開発
AndroidにおけるSingletonパターンの実装
Taro Aoki
こんにちは、こんばんは、今日から大学2年生になってしまう青木です。
2つ前の記事でAndroidにおけるMVCについて解説したので、今回は同じくAndroidで、かつあまり情報がないSingletonパターンの実装方法について紹介したいと思います。
Singletonとはなんぞや?
Singletonパターンはデザインパターンの一種で、あるクラスのインスタンスが1つであることを保証するために使われます。
同じインスタンスを使わなければならない時や、アプリケーションで統一したいことを実現させるために使われたりします。
(間違っていたら指摘お願いします。。。)
Java
Androidアプリケーションではないふつう(?)のJavaでのコード例は以下の様な感じです。
final class Singleton {
private Singleton(){}
private static class SingletonHolder {
private static final Singleton instance = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.instance;
}
}
ソースはWikipediaからの引用です。
コンストラクタでインスタンスを生成し、以降はgetInstance()でそのインスタンスを返すようにしています。
Android
AndroidもJavaで記述される事が多いので、上の通りにすればいいか、というとそうではありません。
以前の記事でも説明したとおり、Androidのライフサイクルによってメモリが圧迫されると、勝手にActivityが破棄されます。
ActivityにSingletonを実装しようとする人は少ないと思いますが、それではふつうのJavaクラスではどうでしょうか。
AndroidではJavaクラスのstatic変数もクリアされる可能性があります。
つまり、上記の実装はAndroidでは難しいのです。ではどうすればいいかというと、Applicationクラスを利用します。
Applicationクラスはアプリのプロセスが開始したのと同時に生成され、アプリプロセスが終了すると同時にこちらも破棄されるので、これをSingletonとして利用することができます。
public class AppController extends Application {
private static AppController sInstance;
@Override
public void onCreate() {
super.onCreate();
sInstance = this;
}
public static AppController getInstance() {
return sInstance;
}
}
このような感じにすればsInstanceはAppControllerのメンバで、AppControllerはApplicationを継承しているため、アプリが終了するまで存在していることが保証されます。
まとめ
ただ、ここまで話しておいてなんですが、AndroidでSingletonをするまえに、Singletonを使わずになんとかできないかを考えてみたほうがいいのかなぁと個人的には思っています。
AndroidのドキュメントにもContextを使ってみては?的な事も書かれています。
なので、どうしても使わざるを得ない場合のみに限定するのがいいかなと思います。
最近、TechBoosterさんの本が紙でも販売されたので、以下の本を買ってみました。駄目コードあたりの内容が参考になります。