2015-09-05 138 views
0

是否可以更改val字段的值? 如果是这样,那么只能通过构造函数完成,而不能在程序中的任何位置完成? 使用val意味着内存位置永远不能被修改? 例如: val x = 5 我可以再次使用x指向具有不同值的不同位置吗?更改val字段的值

回答

7

总之:不,你不能这是不变点,确保您可以总是请确保值保持不变。

这就是为什么有immutables [瓦尔斯]和mutables [瓦尔]它是灵活的,并允许您根据您的需要选择一个选项。选择你的选择并遵守其规则。

3

如果你想有一个领域是可变的,你应该把它声明为var,而不是val。如果由于某种原因,您不能将val更改为var,但仍然需要更改其值,则可以使用反射来完成此操作。

class ModifyVal { 
    val x = 5 
} 

object ModifyVal { 
    def main(args: Array[String]): Unit = { 
    val instance = new ModifyVal() 
    println(instance.x) // 5 
    // instance.x = 10 doesn't compile: Reassignment to val 
    val fieldX = instance.getClass.getDeclaredField("x") 
    fieldX.setAccessible(true) 
    fieldX.setInt(instance, 10) 
    println(instance.x) // 10 
    } 
} 
2

作为一般规则(不诉诸与经纱语言的意图扭曲),没有你不能修改val,也不应该希望。相反,如果您希望继续使用功能性编程风格,请考虑制作一个包含实例的副本,并修改val字段的值。案例类已经帮助这一点通过提供copy构造,使这种操作的:

case class Person(name: String, age: Int) { 
    def birthday = copy(age = age + 1) // returns a new Person with the same name, but one year older 
} 
2

VAL,粗略地讲,是指不变最后在Java中)。

时宣布,一个VAL必须被分配到的东西,无论是价值

val name: String // compilation error 
val name : String = "Hello" 

或没有(尽管没有人做这个)一个VAL分配

val name : String = _ 

后,就不能被重新分配。

不变性是Scala强烈支持的一个有用的特性。这鼓励编写没有副作用和线程安全的代码。这就是为什么Scala是可伸缩和并发应用程序的理想选择。

斯卡拉的一种特殊的不变性是未来。未来是一个只写一次的容器 - 在未来完成之后,它实际上是不可变的。