我試圖理解為什么從類欄位分配的變數不能在函式中更改。考慮這個例子:
class A {
private var a: String? = "a"
fun hello() {
val b = a
if (b != null) {
// The compiler assumes that 'b' is always not null inside this branch
b.length
} else {
// is null
}
}
}
變數b在整個函式中總是相同的(后來在 if 分支中是隱式的非空值)。所以即使通過并發我改變了欄位a,變數b也不會改變?
這怎么可能?Kotlin 是否會復制變數并將其分配給b?我認為作業與參考資料等一起作業。
就我而言,任何型別(字串、整數、自定義類等)都可能發生這種情況
uj5u.com熱心網友回復:
字串是不可變的,實體化后無法更改它們。因此,如果另一個執行緒修改了aafter b != nullwas 的值,它不會影響b' 的值。
實際上,這甚至不是真正的答案,因為這里我們只是在談論無效性。b將指向在分配時指向的任何物件a,但是沒有什么可以改變 b 指向的內容,因為b是 a val。
我只是提到了不變性,因為b如果型別是可變的,則 的內容仍然可以通過突變而改變,但參考本身永遠不會改變。
為了更清楚,讓我們做一個場景:
[thread 1] a = "hello" <state: a => h: String("hello")>
[thread 1] b = a <state: a => h, b => h>
[thread 2] a = "world" <state: a => w: String("world"), b => h>
簡而言之,與賦值時b指向同一個物件a,但不指向a自身,所以a變化時,b無所謂。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/507302.html
