def
สามารถดำเนินการโดยทั้งสองของdef
การval
เป็นหรือlazy val
object
ดังนั้นจึงเป็นรูปแบบนามธรรมที่สุดในการกำหนดสมาชิก เนื่องจากลักษณะมักจะเป็นอินเทอร์เฟซนามธรรมการบอกว่าคุณต้องการval
คือการบอกว่าการใช้งานควรทำอย่างไร หากคุณขอ a val
คลาสการนำไปใช้ไม่สามารถใช้def
.
val
เป็นสิ่งจำเป็นเฉพาะในกรณีที่คุณจำเป็นต้องมีรหัสคงที่เช่นสำหรับชนิดขึ้นอยู่กับเส้นทาง นั่นเป็นสิ่งที่คุณมักไม่ต้องการ
เปรียบเทียบ:
trait Foo { def bar: Int }
object F1 extends Foo { def bar = util.Random.nextInt(33) }
class F2(val bar: Int) extends Foo
object F3 extends Foo {
lazy val bar = {
Thread.sleep(5000)
42
}
}
ถ้าคุณมี
trait Foo { val bar: Int }
คุณจะไม่สามารถที่จะกำหนดหรือF1
F3
โอเคเพื่อให้คุณสับสนและตอบ @ om-nom-nom การใช้นามธรรมval
อาจทำให้เกิดปัญหาในการเริ่มต้น
trait Foo {
val bar: Int
val schoko = bar + bar
}
object Fail extends Foo {
val bar = 33
}
Fail.schoko
นี่เป็นปัญหาที่น่าเกลียดซึ่งในความเห็นส่วนตัวของฉันควรจะหายไปในเวอร์ชัน Scala ในอนาคตโดยแก้ไขในคอมไพเลอร์ แต่ใช่แล้วนี่เป็นเหตุผลว่าทำไมเราจึงไม่ควรใช้นามธรรมval
s
แก้ไข (ม.ค. 2016): คุณได้รับอนุญาตให้ลบล้างการval
ประกาศนามธรรมด้วยlazy val
การนำไปใช้งานเพื่อป้องกันการเริ่มต้นล้มเหลว