なんじゃくにっき

プログラミングの話題中心。

Scala de Design Pattern: Singleton

 Scalaデザインパターンを実装してみようと思う。
GoF本(オブジェクト指向における再利用のためのデザインパターン ソフトバンククリエイティブ刊)
Wikipedia
Scala Wiki
辺りを参考に。
できるだけC++, Javaと比べてScalaっぽいことができるといいなあ。
GoFの23パターン全部終わらせられるのやらどうやら…
 
 
 とりあえずまずはSingletonパターン。
クラスのインスタンスが1つしかできないようにする。
 
Scalaでの実装は簡単。Objectを使うだけ。
言語レベルでサポートされていると楽っすね。 

object Singleton {
val name = "Singleton"
}

object Main {
def main(args: Array[String]) {
val singletonA = Singleton
val singletonB = Singleton
println(singletonA eq singletonB) // true
}
}

 
 あっけなすぎたので上記のソースから生成されるバイトコードを逆コンパイルしてみる
//Singleton.class
import scala.reflect.ScalaSignature;

@ScalaSignature(bytes="\006\001\025:Q!\001\002\t\006\035\t\021bU5oO2,Go\0348\013\005\r!\021!C:j]\036dW\r^8o\025\005)\021!\0043fg&<g\016]1ui\026\024hn\001\001\021\005!IQ\"\001\002\007\021)\021A\021!A\t\006-\021\021bU5oO2,Go\0348\024\007%aA\003\005\002\016%5\taB\003\002\020!\005!A.\0318h\025\005\t\022\001\0026bm\006L!a\005\b\003\r=\023'.Z2u!\t)\002$D\001\027\025\0059\022!B:dC2\f\027BA\r\027\005-\0316-\0317b\037\nTWm\031;\t\013mIA\021\001\017\002\rqJg.\033;?)\0059\001b\002\020\n\005\004%\taH\001\005]\006lW-F\001!!\ti\021%\003\002#\035\t11\013\036:j]\036Da\001J\005!\002\023\001\023!\0028b[\026\004\003")
public final class Singleton {
public static final String name() {
return Singleton..MODULE$.name();
}
}

 
//Singleton$.class
import scala.ScalaObject;

public final class Singleton$
implements ScalaObject {
public static final MODULE$;
private final String name;

static { new (); }

public String name() {
return this.name;
}

private Singleton$() {
MODULE$ = this;
this.name = "Singleton";
}
}