zoukankan      html  css  js  c++  java
  • Scala学习之路 (五)Scala的关键字Lazy

    Scala中使用关键字lazy来定义惰性变量,实现延迟加载(懒加载)。 
    惰性变量只能是不可变变量,并且只有在调用惰性变量时,才会去实例化这个变量。

    在Java中,要实现延迟加载(懒加载),需要自己手动实现。一般的做法是这样的:

    public class JavaLazyDemo {
        private String name;
    
        //初始化姓名为huangbo
        private String initName(){
            return "huangbo";
        }
    
        public String getName(){
            //如果name为空,进行初始化
            if(name == null){
                name = initName();
            }
            return  name;
        }
    
    }

    在Scala中对延迟加载这一特性提供了语法级别的支持:

    lazy val name = initName()

    使用lazy关键字修饰变量后,只有在使用该变量时,才会调用其实例化方法。也就是说在定义property=initProperty()时并不会调用initProperty()方法,只有在后面的代码中使用变量property时才会调用initProperty()方法。

    如果不使用lazy关键字对变量修饰,那么变量property是立即实例化的:

    object ScalaLazyDemo {
      def init():String = {
        println("huangbo 666")
        return "huangbo"
      }
    
      def main(args: Array[String]): Unit = {
        val name = init();
        println("666")
        println(name)
      }
    }

    上面的property没有使用lazy关键字进行修饰,所以property是立即实例化的,调用了initName()方法进行实例化。

    使用Lazy进行修饰

    object ScalaLazyDemo {
      def init():String = {
        println("huangbo 666")
        return "huangbo"
      }
    
      def main(args: Array[String]): Unit = {
        lazy val name = init();
        println("666")
        println(name)
      }
    }

    在声明name时,并没有立即调用实例化方法initName(),而是在使用name时,才会调用实例化方法,并且无论缩少次调用,实例化方法只会执行一次。

  • 相关阅读:
    Oracle 11g学习笔记(3)
    模式识别,图像处理工程师的要求
    vc++17 进程间的通信
    vc++学习笔记16 线程同步,异步套接字
    类型转换 float与int ,(int&)a,(int)&a
    vc++学习笔记16 线程同步,异步套接字
    vc++学习之15 多线程与聊天室程序的创建
    testl指令的问题
    C语言的几种位运算
    C语言的几种位运算
  • 原文地址:https://www.cnblogs.com/qingyunzong/p/8869761.html
Copyright © 2011-2022 走看看