package com.scala.A
/** 惰性加载
* 当函数返回值被声明为 lazy 时,函数的执行将被推迟,直到我们首次对此取值,该函数才会执行。这种函数我们称之为惰性函数
* */
/**
* 使用lazy声明的变量只有在使用的时候才会进行初始化。在Scala中,通过使用保护式来实现惰性值。当客户代码引用了惰性值时,保护式会拦截引用并检查此时是否需要初始化惰性。
* 由于保护式能够确保惰性在第一次访问之前便已初始化,因此增加保护式检查只有当第一次引用惰性值时才是必要的。
* 由于,保护式一直会检查惰性值是否已经初始化,所以惰性值与“立刻”值相比,其具有额外的开销。所以我们需要考虑惰性值的使用情况。
* 只有当保护式带来的额外开销小于初始化带来的开销时,或者将某些值惰性化能简化系统初始化过程并确保执行顺序满足条件时,我们才应该使用惰性值。
* */
object scala_function_06 {
def main(args: Array[String]): Unit = {
val res = sum(1, 1)
println("-----")
println("res=" + res)
//------------------------------------------------------------------------------------------------------------------
/**
* 输出为:
* -----
* sum..
* res=2
* 惰性加载,不会立即执行sum(1,1),是当第一次取值(res)的时候,才会执行sum(1,1)
**/
//------------------------------------------------------------------------------------------------------------------
/**
* 如果去掉lazy,输出:
* sum..
* -----
* res=2
* 首先就会执行sum(1,1)函数,就会输出”sum..“,然后输出”-----“,最后打印res
**/
}
//--------------------------------------------------------------------------------------------------------------------
def sum(x: Int, y: Int): Int = {
println("sum..")
x + y
}
}