Scalaã§ã·ã³ã°ã«ãã³ã¨ããã°ãobjectåã§ããããå®ã¯ããã¯ã ããã§çµãããã§ã¯ããã¾ããã仿¥ã¯ãããªè©±ã
object Singleton { println("Construct") val name = "SINGLETON" }
println(Singleton.name)
jadãã¨ãããªæãã
public final class Singleton$ implements ScalaObject { private final String name = "SINGLETON"; public String name() { return name; } public static final Singleton$ MODULE$ = this; static { new Singleton$(); } // ä¸è¨ã¯ public static final Singleton$ MODULE$ = new Singleton$(); ã ã¨æããã private Singleton$() { Predef$.MODULE$.println("Construct"); } }
public final class Singleton { public static final String name() { return Singleton$.MODULE$.name(); } }
// println(Singleton.name)
Predef$.MODULE$.println(Singleton$.MODULE$.name());
è¨ãããããªãobjectåã§å®£è¨ããã·ã³ã°ã«ãã³ã¯ãstatic finalãã£ã¼ã«ãã§ã¤ã³ã¹ã¿ã³ã¹ãä¿æããã®ã§ã並è¡å¦çã«ããã¦ã®åæåå®å ¨æ§ãä¿è¨¼ãããããã§ãã
Scalaã§é å»¶åæåã®ã·ã³ã°ã«ãã³ãæ¸ããã¨ã¯ã§ããã
以ä¸ã®ããã«æ¸ãã¦ã¿ã¾ããã(ã·ã³ã°ã«ãã³ã¨ããããlazy valã®è©±ã«ãªã£ã¦ãã¾ãã¾ããããã)
é
å»¶åæåããã·ã³ã°ã«ãã³ã¯ã©ã¹ã¨ãã¦ãLazySingletonã¯ã©ã¹ãç¨æããã³ã³ãããªã³ãªãã¸ã§ã¯ãã§ããLazySingletonãªãã¸ã§ã¯ããåä¸ãã¡ã¤ã«ã«å®ç¾©ãã¾ãã
class LazySingleton { println("Lazy Construct") val name = "SINGLETON" } object LazySingleton { private lazy val instance = new LazySingleton def apply() = instance }
å©ç¨ããæã¯ä»¥ä¸ã®ãããªæãã
// 以ä¸ã¯println(LazySingleton.apply().name)ã®æ§æç³è¡£ println(LazySingleton().name) // ããã§åæåããã println(LazySingleton().name)
LazySingletonãªãã¸ã§ã¯ãã®lazy valã§ããinstanceãã£ã¼ã«ããåç
§ãããæã«LazySingletonã¯ã©ã¹ã®ã³ã³ã¹ãã©ã¯ã¿ãå¼ã°ãã¦ãé
å»¶åæåããã¾ãã
jadãã¨ä»¥ä¸ã®ãããªã³ã¼ãã«ãªãã¾ãã
public final class LazySingleton$ implements ScalaObject { public static final LazySingleton$ MODULE$ = this; static { new LazySingleton$(); } private LazySingleton instance; public volatile int bitmap$0; // åæåãã©ã°ã ã¨æãã private LazySingleton instance() { if((bitmap$0 & 1) == 0) synchronized(this) { if((bitmap$0 & 1) == 0) { instance = new LazySingleton(); bitmap$0 = bitmap$0 | 1; } BoxedUnit _tmp = BoxedUnit.UNIT; } return instance; } public LazySingleton apply() { return instance(); } private LazySingleton$() { } }
// println(LazySingleton().name)
Predef$.MODULE$.println(LazySingleton$.MODULE$.apply().name());
注ç®ãããã®ã¯ãlazy valã®ã»ãã³ãã£ã¯ã¹ã§ãããinstanceã¡ã½ãããè¦ã¦ãã ãããåæåãã©ã°ã¨æãããvolatileãã£ã¼ã«ãã§ããbitmap$0ãã£ã¼ã«ãã使ã£ãããã«ãã§ããã³ã°ãã¸ãã¯ã«ãªã£ã¦ãã¾ãã
対ç3ï¼volatileãã£ã¼ã«ãã¨åºæããã¯(synchronized)ãä½µãã¦ä½¿ã
次ã¯ãvolatileã¨synchronizedã使ã£ãããã«ãã§ããã³ã°ãã¸ãã¯
ã¤ã¾ããScalaã§ã¯ãfinalãã£ã¼ã«ãã¨ãªãvalã ãã§ãªããlazy valãã¹ã¬ããã»ã¼ãã®ã§ããã æèããªãã¦ãã¹ã¬ããã»ã¼ãã«ãªã£ã¦ããã£ã¦ãããããvarã¯æ³¨ææ·±ãæ±ãã¨ããã®ã¯ã¹ã¬ããã»ã¼ãã®è¦³ç¹ãããæ£ããã¨ãããã¨ãªãã§ãããããè峿·±ãã