Java&Scala比较---设计模式(Singleton)

24 篇文章 0 订阅
18 篇文章 1 订阅

单例模式在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 SinglescalacSingle.classSingle .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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值