高卒文系Scala vol.11 - シングルトンオブジェクト -

Scala本、4.3辺り。個人的にJavaと比べて、凄い便利だなーと思ったところです。

GoFデザインパターンのSingletonパターンは、比較的よく使われるデザインパターンの一つだと思います。

Javaだと、Singletonパターンを実装するのに、毎回同じようなコーディングをする必要がありますが、

Scalaでは言語仕様でそのSingletonパターンが組み込まれています。

しかも、定義が凄く簡単です。

クラス定義の「class」を「object」にするだけ。

構成が微妙ですが、以下が例。

/**
* 標準出力ログ コンパニオンクラス
*/
class Logger {
  println("initialize : instance")
  def instanceLog(s:String) = println("instance log : " + s)
}

/**
* 標準出力ログ シングルトンオブジェクト
*/
object SingletonLogger{
  println("initialize : singleton object")
  def singletonLog(s:String) = println("singleton log :" + s)
}

/**
* 標準出力ログ コンパニオンオブジェクト
*/
object Logger{
  println("initialize : companion object")
  def companionLog(s:String) = println("companion log :" + s)
}

「class Logger」がクラス定義で、「object SingletonLogger」や「object Logger」がシングルトンオブジェクトの定義です。
「コンパニオンオブジェクト」というのは、クラスと同じ名前のシングルトンオブジェクトの事です。
「コンパニオンクラス」というのは、そのコンパニオンオブジェクトのクラスの事です。
何故かはよくわからないですが、シングルトンオブジェクトとクラス名が同じ場合に「コンパニオン」と付くそうです。
以下がクライアントコードと、実行結果です。

val logger = new Logger()
logger.instanceLog("T.H")
println("")
SingletonLogger.singletonLog("tomochika")
println("")
Logger.companionLog("zetta1985")
initialize : instance
instance log : T.H
initialize : singleton object
singleton log :tomochika
initialize : companion object
companion log :zetta1985

クラス定義やシングルトンオブジェクト定義の中括弧の中は、初期化時に呼び出されます。

コンストラクタ、という認識で大丈夫だと思います、たぶん。

Scala本には、

「Javaプログラマはシングルトンオブジェクトをstaticメソッドの定義場所だと考えるといいよ!」

と書いてありましたが、"普通のJavaプログラマ"ならSingletonパターンは知ってて当然だと思うので

Scalaのシングルトンオブジェクトを理解するのに苦労する事はないと思います。

このエントリーをはてなブックマークに追加
comments powered by Disqus