研究一下Scala语言的单例对象(Singleton Objects),为下一篇文章做准备。

static不是keyword

上一篇文章提到过,interface并非Scala语言keyword,能够自由使用。

相同,static在Scala里也没有特殊的含义,也是能够自由使用的,如以下代码所看到的:

单例对象

Java并非完美的面向对象语言,包含非常多缺陷,比方同意static字段和方法,primitive类型。等等。Scala语言在这些方面都有所改进。所以号称是比Java更OO的语言。

既然去掉了statickeyword,那么怎样像Java语言那样。表达类字段类方法呢?Scala给出的解决方式是:单例对象。Java有一个Math类(java.lang.Math),里头全是static字段和方法,部分代码例如以下所看到的:

public final class Math {

    private Math() {} // Don't let anyone instantiate this class.

    public static final double PI = 3.14159265358979323846;

    public static int abs(int a) {
return (a < 0) ? -a : a;
} }

以下我们用Scala语言重写上面的Math类:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvenhob28=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

单例对象实现方式

以下看看Scala是怎样实现单例对象的。观察编译结果能够看到,MyMath被编译出两个class:MyMath.classMyMath$.class。我自己分析了一下这两个class,以下是MyMath.class的反编译结果:

public final class MyMath {

    public static double PI() {
return MyMath$.MODULE$.PI();
} public static int abs(int a) {
return MyMath$.MODULE$.abs(a);
} }

能够得出例如以下结论:

  1. val字段实际上也被编译成了方法
  2. 两个方法都是static,并且仅仅是调用MyMath$.MODULE$的对应方法

再来看MyMath$.class的反编译结果:

public final class MyMath$ {

    public static final MyMath$ MODULE$;
private final double PI; static {
new MyMath$();
} private MyMath$() {
MyMath$.MODULE$ = this;
this.PI = 3.14;
} public double PI() {
return this.PI;
} public int abs(int a) {
return return (a < 0) ? -a : a;
} }

就是普通的单例模式,这肯定也就是单例对象这一名称的由来。

使用单例对象

以下这段代码演示了怎样使用单例对象:

看起来和使用Java静态字段或方法没啥差别,以下是反编译之后的main方法代码:

Predef$.MODULE$.println("PI is " + MyMath$.MODULE$.PI())
final int x = -18
final int y = MyMath$.MODULE$.abs(x)

伴随类和伴随对象

上面的样例中,我们定义了名为MyMath的单例对象,实际上。这并最好还是碍我们定义同名的

例如以下所看到的:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvenhob28=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

这样的情况下,单例对象叫做同名类的Companion Object。类叫做单例对象的Companion Class

假设仅定了单例对象。但未定义同名的类。那么这样的情况下单例对象被叫做Standalone Object

注意:Companion Class和Object必须定义在同一个.scala文件中。

探索Scala(3)-- 单例对象的更多相关文章

  1. Scala单例对象、伴生对象实战详解

    1.Scala单例对象 Scala单例对象是十分重要的,没有像在Java一样,有静态类.静态成员.静态方法,但是Scala提供了object对象,这个object对象类似于Java的静态类,它的成员. ...

  2. Scala单例对象和伴生对象

    1.Scala单例对象 Scala单例对象是十分重要的,没有像在Java一样,有静态类.静态成员.静态方法,但是Scala提供了object对象,这个object对象类似于Java的静态类,它的成员. ...

  3. Scala入门1(单例对象和伴生类)

    一.Hello World程序的执行原理 参考http://blog.csdn.net/zhangjg_blog/article/details/22760957 object HelloWorld{ ...

  4. scala学习手记14 - 单例对象

    java中的单例模式都很熟悉了:简单地说就是一个类只能有一个实例.在scala中创建单例对象非常简单,创建类时使用object关键字替换class即可.因为单例类无法初始化,所以不能向它的主构造函数传 ...

  5. 【scala】类的定义和单例对象

    一.类的定义 Scala类的定义跟JAVA中类的定义基本是一样的. 示例 class ChecksumAccumulator{ var sum = 0;//Scala默认关键字为public priv ...

  6. Scala 孤立对象和单例对象方法体的用法和例子

    [学习笔记] 1  以object关键字修饰一个类名,这种语法叫做孤立对象,这个对象是单例的. 相当于将单例类和单例对象同时定义.相当于java中的单例,即在内存中只会存在一个Test3实例.创建一个 ...

  7. Spring IoC 中的(Singleton)单例对象创建过程探索

    前言 之前将spring framework 源码导入了idea,后来折腾调试了一下,于是研究了一下最简单的singleton对象在spring中是如何创建的.这里所谓的简单,就是指无属性注入,无复杂 ...

  8. 010-Scala单例对象、伴生对象实战详解

    010-Scala单例对象.伴生对象实战详解 Scala单例对象详解 函数的最后一行是返回值 子项目 Scala伴生对象代码实战 object对象的私有成员可以直接被class伴生类访问,但是不可以被 ...

  9. apply 伴生对象 单例对象

    apply(): 当类或者对象有一个主要用途时,apply方法提供了很好语法机制 scala> class Foo {} defined class Foo scala> object F ...

随机推荐

  1. OSPF 提升 一 ----基础

    ospf  ccnp内容   一  link-state protocols      IGP   开放式的最短路径优先协议     公有协议 支持中到大型的网络    spf算法 链路状态协议 1. ...

  2. Leetcode 376.摆动序列

    摆动序列 如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列.第一个差(如果存在的话)可能是正数或负数.少于两个元素的序列也是摆动序列. 例如, [1,7,4,9,2,5] 是一个 ...

  3. BZOJ 4001 [TJOI2015]概率论 ——找规律

    题目太神了,证明还需要用到生成函数. 鉴于自己太菜,直接抄别人的结果好了. #include <map> #include <cmath> #include <queue ...

  4. [TyvjP1519] 博彩游戏(AC自动机 + DP)

    传送门 和bzoj1030一个德性 #include <queue> #include <cstdio> #include <cstring> #define N ...

  5. FZU 2186 小明的迷宫 【压状dp】

    Problem Description 小明误入迷宫,塞翁失马焉知非福,原来在迷宫中还藏着一些财宝,小明想获得所有的财宝并离开迷宫.因为小明还是学生,还有家庭作业要做,所以他想尽快获得所有财宝并离开迷 ...

  6. bzoj1063【Noi2008】道路设计

    题意:http://www.lydsy.com/JudgeOnline/problem.php?id=1063 用一种划分方式将树划为重链和轻链,使得所有点到根节点的路径经过的轻链最大值最小 sol: ...

  7. kali 1.1.0 boot failed

    从几个月前的14.10 daily 版本就有U盘刻录无法启动的现象,相关bug可参见:         https://bugs.launchpad.net/ubunt ... reator/+bug ...

  8. ADO:防止更新的数据含有单引号而出错

    原文发布时间为:2008-08-01 -- 来源于本人的百度文章 [由搬家工具导入] public void Update( string au_lname, string zip,string au ...

  9. localStorag的一点见解

    dot方法对localStorag方法进行键值操作 设值 localStorage.hello = 'world'; localStorage.zhangsan = 'lisi'; 取值: var v ...

  10. R语言入门---杂记(一)---R的常用函数

    1.nchar():查看字符串长度. 2.rev(): 给你的数据翻个个 3.sort():给你数据排个序(默认从小到大依次排列) 4.runif():产生均匀分布的随机数 #runif