单例模式在Scala中就是一个默认实现的模式。 对于Java中的单例模式,请看
http://www.ivanpig.com/blog/?p=75。 虽然从代码上看,单例模式很简单。但是涉及到多线程问题,问题会很复杂。 Scala中完全不用担心这个问题。
object Single{
def say(){
println("Hello")
}
def main(args : Array[String]){
Single.say()
Single.say()
}
}
搞定。乍一看怎么也不像是单例模式,更像是静态方法的调用。我们来看一下这段代码实际的执行流程就明白了
scalac Single.scala
javap -verbose Single$
这里在反编译的是Single而不是Single,是因为scalac编译生成了Single.class和Single.class这两个文件。而实际代码在Single$.class中,Single.class只是对Single$.class的一个调用。 反编译得到
......
{
public static final Single$ MODULE$;
public static {};
Code:
Stack=1, Locals=0, Args_size=0
0: new #2; //class Single$
3: invokespecial #12; //Method "<init>":()V
6: return
public void say();
Code:
Stack=2, Locals=1, Args_size=1
0: getstatic #18; //Field scala/Predef$.MODULE$:Lscala/Predef$;
3: ldc #20; //String Hello
5: invokevirtual #24; //Method scala/Predef$.println:(Ljava/lang/Object;)
V
8: return
LocalVariableTable:
Start Length Slot Name Signature
0 9 0 this LSingle$;
LineNumberTable:
line 6: 0
public void main(java.lang.String[]);
Code:
Stack=1, Locals=2, Args_size=2
0: aload_0
1: invokevirtual #29; //Method say:()V
4: aload_0
5: invokevirtual #29; //Method say:()V
8: return
LocalVariableTable:
Start Length Slot Name Signature
0 9 0 this LSingle$;
0 9 1 args [Ljava/lang/String;
LineNumberTable:
line 10: 0
line 11: 4
}
从这里我们就可以看出上面这段Scala代码所对应的Java代码了。 首先,有一个Single$类型的static final的对象。并且有一个静态化块来初始化它。所以只有在第一次调用时才会实例化此对象。在main方法中只是简单的调用而已。
Blog URL : http://www.ivanpig.com/blog/?p=523
分享到:
相关推荐
hadoop-3.0.0.jar安装包;spark-2.4.0.gz安装包;scala-2.13.3.zip安装包;apache-maven-3.6.3-bin.zip安装包
赠送jar包:scala-java8-compat_2.11-0.7.0.jar; 赠送原API文档:scala-java8-compat_2.11-0.7.0-javadoc.jar; 赠送源代码:scala-java8-compat_2.11-0.7.0-sources.jar; 赠送Maven依赖信息文件:scala-java8-...
windows版本 scala-2.12.14.zip & Linux版本 scala-2.12.11.tgz 压缩包.rar
标签:11、parser、scala、combinators_2、lang、modules、jar包、java、API文档、中文版; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构...
标签:scala、lang、compiler、中英对照文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,...
快学Scala完整版,Scala编程(中文版)&Scala程序设计-多线程编程实践,非常清晰,适合阅读
赠送jar包:scala-java8-compat_2.11-0.7.0.jar; 赠送原API文档:scala-java8-compat_2.11-0.7.0-javadoc.jar; 赠送源代码:scala-java8-compat_2.11-0.7.0-sources.jar; 赠送Maven依赖信息文件:scala-java8-...
IntellJIDEA Scala插件:scala-intellij-bin-2016.3.9
赠送jar包:scala-parser-combinators_2.11-1.0.4.jar; 赠送原API文档:scala-parser-combinators_2.11-1.0.4-javadoc.jar; 赠送源代码:scala-parser-combinators_2.11-1.0.4-sources.jar; 包含翻译后的API...
标签:scala、lang、compiler、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请...
标签:scala、lang、modules、parser、combinators、中英对照文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,...
scala eclipse插件.对应scala版本:2.10--2.11,对应eclipes版本:4.4--4.5. update site:http://download.scala-ide.org/sdk/lithium/e44/scala211/stable/site 下载地址:...
标签:scala、lang、compiler、中英对照文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,...
标签:scala、lang、modules、xml、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,...
标签:reflect、scala、lang、jar包、java、API文档、中英对照版; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准...
标签:scala、lang、compiler、jar包、java、中文文档; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请...
标签:scala、lang、modules、xml、中英对照文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准...
标签:scala、lang、modules、parser、combinators、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释...
scala-SDK-4.7.0-vfinal-2.12-win32.win32.x86_64 scala-SDK-4.7.0-vfinal-2.12-win32.win32.x86_64
scala-intellij-bin-2021.3.6.zip