单例模式在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
分享到:
相关推荐
本教程专为已有一定编程经验、特别是熟悉Java语言的程序员设计,帮助他们快速上手Scala。 ### 1.1 目标读者 本教程的目标读者是对面向对象编程有一定了解的人,特别是具备Java基础的程序员。读者通过学习Scala,...
### Scala与设计模式 #### 一、概述 随着软件工程的发展,设计模式逐渐成为软件开发中的重要组成部分。《设计模式:可复用面向对象软件的基础》(Design Patterns: Elements of Reusable Object-Oriented Software...
本主题主要探讨的是如何在两种不同的编程语言——Java和Scala中实现这些设计模式。 Java,作为历史悠久且广泛使用的面向对象语言,拥有丰富的设计模式库。其经典设计模式包括单例(Singleton)、工厂方法(Factory ...
Scala被设计成高度类型安全,支持类型推测,这意味着程序员可以省略某些类型的声明,编译器会自动推断它们。这种语言在大数据处理领域,尤其是Apache Spark框架中得到了广泛应用。 Spark1.6版本依赖Scala2.10,而从...
- 可伸展性:Scala语言设计允许用户自定义新的类型和控制结构。 - 面向对象与函数式编程:Scala融合了两种编程范式的优势。 - 兼容性:Scala能够与Java无缝集成。 - 简洁性:Scala通过强大的类型推断减少冗余...
- Scala 中的类和对象更紧密地结合在一起,单例对象(Singleton Object)可以替代 Java 中的静态方法。例如,`object MathUtils { def sqrt(x: Double): Double = math.sqrt(x) }`。 7. **特质(Traits)**: - ...
Singleton设计模式也多次使用。 指示 先决条件 安装在您的系统上 开户 与GitHub帐户关联的(不需要特殊作用域) 运行应用程序 产生一个在GitHub上(如果尚未生成)。 有关如何创建一个的参考。 该应用程序可与公共...
- **Singleton对象**: 学习如何使用对象关键字来创建单例模式。 - **Scala程序**: 理解如何组织Scala代码以构成完整的程序。 - **Application特质**: 探讨如何使用`Application`特质来简化命令行程序的编写。 #### ...
《设计模式:Scala语言实现详解》 设计模式是软件工程中的宝贵经验总结,它们是解决常见问题的最佳实践,被广泛应用于各种编程语言中。Scala,作为一种多范式编程语言,结合了面向对象和函数式编程的特点,使得在...
Scala设计模式:源码解析 Scala设计模式是面向对象编程和函数式编程融合的语言中的一种重要概念,它提供了一种组织代码、解决常见问题的模板。本书“Scala Design Patterns”结合了理论与实践,通过一系列的示例...
`Play Framework` 是一个开源的Web应用框架,基于Java和Scala构建,遵循“约定优于配置”的原则,提供快速、可测试和快乐的开发体验。它支持HTTP、WebSocket以及现代Web服务协议,允许开发者用一种更接近自然语言的...
学习Scala不仅能够提升编程能力,还能接触到现代编程语言的最新理念,对于那些已经熟悉Groovy或其他Java虚拟机(JVM)语言的开发者来说,Scala提供了更丰富和灵活的编程方式。通过深入阅读并实践"Scala参考手册",...
单例对象(Singleton)是Scala的一个独特特性,它可以避免Java中的静态方法带来的副作用。 5. **模式匹配**:Scala的模式匹配允许开发者根据不同的条件执行不同操作,这是函数式编程中常见的特性,增强了代码的...
在IT行业中,依赖注入(Dependency Injection,简称DI)是一种设计模式,它可以帮助我们构建松散耦合、可测试和可维护的代码。在Scala中,Play框架与Google的Guice库结合,提供了一种优雅的方式来实现DI。让我们深入...
单例对象(Singleton)是 Scala 中的一个独特概念,用于替代 Java 中的静态成员。 6. **继承**:Scala支持单一继承,一个类只能继承一个父类,但可以通过trait(特质)实现多重继承的效果。子类可以覆盖父类的方法...
Singleton对象是Scala特有的,它类似于Java中的单例模式,但更易于使用。 4. **集合库**:Scala的集合库是其强大功能的一部分,提供了丰富的数据结构,如List、Set、Map,以及高效的操作方法。集合支持惰性求值和...
类型系统是Scala的一个核心部分,它包括基本类型(Value Types)如Int、Double、Boolean等,以及复杂类型如单例类型(Singleton Types)、类型投影(Type Projection)、类型设计ator(Type Designators)、参数化...
Spark 是一个用于大规模数据处理的开源集群计算框架,它提供了高级API用于Scala、Java 和 Python等语言,并优化了中间层的数据处理过程,使其运行速度更快。Spark 的设计初衷是解决Hadoop MapReduce在迭代式计算和...
依赖注入是一种设计模式,它可以帮助我们编写更灵活、可测试和易于维护的代码。在Scala中,Play框架通过Guice库实现了DI。 首先,我们需要理解依赖注入的基本概念。依赖注入允许我们在不直接创建对象的情况下,将...