LoginSignup
24
13

More than 3 years have passed since last update.

Kotlinでデザインパターン Singleton編

Last updated at Posted at 2019-02-21

はじめに

本記事はJava言語で学ぶデザインパターン入門を参考にしながら
JavaではなくKotlinで実装してみようというものです。

Java言語で学ぶデザインパターン入門

調べてみる

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を使いたいときはオブジェクトの宣言を使う
  • オブジェクトの宣言はアクセスしたときに初期化されるので注意する

これらがポイントみたいです。

参考記事

24
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
24
13