Внутри класса val
оценивается при инициализации, в то время как def
оценивается только тогда, когда и каждый раз вызывается функция.В приведенном ниже коде вы увидите, что x вычисляется при первом использовании объекта, но не снова при обращении к члену x.Напротив, y не оценивается, когда создается экземпляр объекта, но оценивается каждый раз, когда к элементу обращаются.
class A(a: Int) {
val x = { println("x is set to something"); a }
def y = { println("y is set to something"); a }
}
// Prints: x is set to something
val a = new A(1)
// Prints: "1"
println(a.x)
// Prints: "1"
println(a.x)
// Prints: "y is set to something" and "1"
println(a.y)
// Prints: "y is set to something" and "1"
println(a.y)