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時,才會調用實例化方法,並且無論縮少次調用,實例化方法只會執行一次。