zoukankan      html  css  js  c++  java
  • 探索Scala(3)-- 单例对象

    研究一下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类:

    单例对象实现方式

    以下看看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的单例对象,实际上。这并最好还是碍我们定义同名的

    例如以下所看到的:

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

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

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

  • 相关阅读:
    拥有自己的代码生成器—Newlife.XCode模板编写教程
    基于Newlife.XCode的权限系统(含数据集权限)【设计篇】
    拥有自己的代码生成器—NewLife.XCode代码生成器分析
    利用javascript来转换GB2312到UNICONDE &#形式
    和荣笔记 从 Unicode 到 GB2312 转换表制作程式
    如何做SVN迁移
    和荣笔记 GB2312 字符集和编码说明
    asp对象化之:基于adodb.stream的文件操作类
    Unicode 汉字内码表
    微软建议的ASP性能优化28条守则 之三
  • 原文地址:https://www.cnblogs.com/liguangsunls/p/6809835.html
Copyright © 2011-2022 走看看