2015-09-05 142 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是可伸縮和併發應用程序的理想選擇。

斯卡拉的一種特殊的不變性是未來。未來是一個只寫一次的容器 - 在未來完成之後,它實際上是不可變的。