สกาล่า SIP-20เสนอการใช้งานใหม่ของ lazy val ซึ่งถูกต้องมากกว่า แต่ช้ากว่าเวอร์ชั่น "ปัจจุบัน" ประมาณ 25%
เสนอการดำเนินงานดูเหมือนว่า:
class LazyCellBase { // in a Java file - we need a public bitmap_0
public static AtomicIntegerFieldUpdater<LazyCellBase> arfu_0 =
AtomicIntegerFieldUpdater.newUpdater(LazyCellBase.class, "bitmap_0");
public volatile int bitmap_0 = 0;
}
final class LazyCell extends LazyCellBase {
import LazyCellBase._
var value_0: Int = _
@tailrec final def value(): Int = (arfu_0.get(this): @switch) match {
case 0 =>
if (arfu_0.compareAndSet(this, 0, 1)) {
val result = 0
value_0 = result
@tailrec def complete(): Unit = (arfu_0.get(this): @switch) match {
case 1 =>
if (!arfu_0.compareAndSet(this, 1, 3)) complete()
case 2 =>
if (arfu_0.compareAndSet(this, 2, 3)) {
synchronized { notifyAll() }
} else complete()
}
complete()
result
} else value()
case 1 =>
arfu_0.compareAndSet(this, 1, 2)
synchronized {
while (arfu_0.get(this) != 3) wait()
}
value_0
case 2 =>
synchronized {
while (arfu_0.get(this) != 3) wait()
}
value_0
case 3 => value_0
}
}
ตั้งแต่เดือนมิถุนายน 2013 SIP นี้ยังไม่ได้รับการอนุมัติ ฉันคาดว่าน่าจะได้รับการอนุมัติและรวมอยู่ใน Scala เวอร์ชันในอนาคตตามการอภิปรายรายชื่อผู้รับจดหมาย ดังนั้นฉันคิดว่าคุณควรที่จะระวังการสังเกตของ Daniel Spiewak :
Lazy val เป็น * ไม่ * ฟรี (หรือถูกกว่า) ใช้มันเฉพาะในกรณีที่คุณต้องการความเกียจคร้านสำหรับความถูกต้องไม่ใช่เพื่อการปรับให้เหมาะสม
bitmap$0
เขตข้อมูลมีความผันผวนในการใช้งานปัจจุบัน (2.8)