加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

如何在Scala 2.10中实现延迟val类变量?

发布时间:2020-12-16 09:35:21 所属栏目:安全 来源:网络整理
导读:This answer至 What’s the (hidden) cost of Scala’s lazy val?显示了它们在Scala 2.7中的实现。但是正如评论所说,这一定从此改变了,所以我很好奇,现在(2.10)类的懒惰变量的实现是什么? 解决方法 用scala 2.10.2编译: class Foo { lazy val bar = mat
This answer至 What’s the (hidden) cost of Scala’s lazy val?显示了它们在Scala 2.7中的实现。但是正如评论所说,这一定从此改变了,所以我很好奇,现在(2.10)类的懒惰变量的实现是什么?

解决方法

用scala 2.10.2编译:

class Foo {

  lazy val bar = math.pow(5,3)

}

然后用JD-GUI反编译结果:

import scala.math.package.;
import scala.reflect.ScalaSignature;

@ScalaSignature(bytes="0601e1A!01020113t31ai81303rtq01P3naRLhh0101240501101CA04133305A!"A050213M3427r1n05-A!AB!osJ+grC0316012105a"0104=S:LGO20130237A210103A070205!A!0301EC0223051#A02cCJ,220106t0317UI!A060503r21{WO317f21!A0201#A!B23!2201022be0202")
public class Foo {

    private double bar;
    private volatile boolean bitmap$0;

    private double bar$lzycompute() {
        synchronized (this) { 
            if (!this.bitmap$0) { 
                this.bar = package..MODULE$.pow(5.0D,3.0D); 
                this.bitmap$0 = true; 
            } 
            return this.bar; 
        }  
    } 

    public double bar() { 
        return this.bitmap$0 ? this.bar : bar$lzycompute(); 
    }

}

编辑 – 这是三个字段的样子:

class Foo {

  lazy val a = math.pow(5,1)
  lazy val b = math.pow(5,2)
  lazy val c = math.pow(5,3)

}

反编译:

import scala.math.package.;
import scala.reflect.ScalaSignature;

@ScalaSignature(bytes="0601052A!01020113t31ai81303rtq01P3naRLhh0101240501101CA04133305A!"A050213M3427r1n05-A!AB!osJ+grC0316012105a"0104=S:LGO20130237A210103A070205!A!0301EC0223051#A01b+05!02CA042623t102B0104E_V24G.3205t101At21)Q05)052121rt05t501A)31!C01'05t!r03053501!05t25)032503t21070503053701!25r21"01240305310702032101210305132502130205r0403")
public class Foo {

    private double a;
    private double b;
    private double c;

    private volatile byte bitmap$0;

    private double a$lzycompute() {
        synchronized (this) {
            if ((byte)(this.bitmap$0 & 0x1) == 0) {
                this.a = package..MODULE$.pow(5.0D,1.0D); 
                this.bitmap$0 = ((byte)(this.bitmap$0 | 0x1)); 
            } 
            return this.a;
        }  
    } 

    private double b$lzycompute() { 
        synchronized (this) {
            if ((byte)(this.bitmap$0 & 0x2) == 0) {
                this.b = package..MODULE$.pow(5.0D,2.0D); 
                this.bitmap$0 = ((byte)(this.bitmap$0 | 0x2)); 
            } 
            return this.b; 
        }  
    } 

    private double c$lzycompute() { 
        synchronized (this) {
            if ((byte)(this.bitmap$0 & 0x4) == 0) {
                this.c = package..MODULE$.pow(5.0D,3.0D); 
                this.bitmap$0 = ((byte)(this.bitmap$0 | 0x4)); 
            } 
            return this.c;
        }
    }

    public double a() {
        return (byte)(this.bitmap$0 & 0x1) == 0 ? a$lzycompute() : this.a;
    }

    public double b() { 
        return (byte)(this.bitmap$0 & 0x2) == 0 ? b$lzycompute() : this.b; 
    } 

    public double c() { 
        return (byte)(this.bitmap$0 & 0x4) == 0 ? c$lzycompute() : this.c;
    }

}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读