如何初始化类外的不可变val

时间:2018-02-09 18:56:18

标签: scala immutability lazy-initialization

我想知道在scala中是否有一种方法可以定义一个不可变值而不将其初始化为任何参数,直到使用一个值显式调用它来将其初始化到该类的范围之外。

实施例

abstract sealed class Animal{
  abstract val age:Int
}

case class Dog() extends Animal{
  override lazy val age:Int = _
}

现在想象 Dog 从课程范围之外调用,比如在 Main 类中调用:

object Main extends Main{
val dog = Dog()
dog.age = 12 // HOW CAN I DO THIS -- without defining age as mutable?
}

2 个答案:

答案 0 :(得分:4)

值是不可变的意味着...(惊喜!)它不能被变异。 您必须在创建它时对其进行初始化:

 case class Dog(age: Int) extends Animal
 val dog = Dog(12)

另请注意,(1)没有参数的案例类没有多大意义,(2)在参数列表之外的case类中声明val并不像人们期望的那样工作。

答案 1 :(得分:3)

如果您定义Dog类(如下所示)

,则可以将age作为构造函数参数传递
abstract sealed class Animal {
  val age:Int
}

case class Dog(val age: Int) extends Animal

object Main extends Main {
  val dog = Dog(12)
}