はじめに
本記事はJava言語で学ぶデザインパターン入門を参考にしながら
JavaではなくKotlinで実装してみようというものです。
調べてみる
Singletonがやりたいことは、次に記載する内容です。
- そのクラスに存在するインスタンスが必ず一つであることを保証する
- アプリケーションの設計上、インスタンスが複数存在してはいけないという成約を実現する。
実装してみる
Javaだとどうだったか?
Javaですと次のコードのようにSingletonを実装します。
- コンストラクタをPrivateとして外部からインスタンスを生成できないようにする。
- そしてgetInstanceからstaticで宣言されたインスタンスをリターンする。
public class Singleton {
private static Singleton singleton = new Singleton();
private Singleton() {
System.out.println("インスタンスを生成しました。")
}
public static Singleton getInstance() {
return singleton;
}
}
ですがKotlinではClassのコンストラクタはPrivateにできませんし、
またStaticがないのでJavaと同じように実装するのは無理そうです。
じゃKotlinだとどうするか?
調べて見たところ、Kotlinでは公式がSingletonパターンを容易に使えるように
”オブジェクトの宣言”という言語機能を提供しているみたいです。
"オブジェクトの宣言"はアクセスしたときに初期化されるようです。
それでは次のようなSingletonを作成して動作を確認してみましょう。
object Singleton {
val created = LocalDateTime.now()
fun write() {
println("write")
}
fun read() {
println("read")
}
}
生成されるインスタンスも一つになっていますし、
あとアクセスしたときに初期化されています。
fun main(args: Array<String>) {
println("start " + LocalDateTime.now().toString())
println("created " + Singleton.created.toString())
Singleton.write()
Singleton.read()
println("created " + Singleton.created.toString())
println("finish " + LocalDateTime.now().toString())
}
---------------------------------------------------------
start 2019-02-22T00:44:45.601
created 2019-02-22T00:44:45.602
write
read
created 2019-02-22T00:44:45.602
finish 2019-02-22T00:44:45.602
おわりに
次にKotlinでSingletonパターンを実装したいときは
- Singletonを使いたいときはオブジェクトの宣言を使う
- オブジェクトの宣言はアクセスしたときに初期化されるので注意する
これらがポイントみたいです。