Kotlin核心編程》 ——2.5 字符串的定義和操作">《Kotlin核心編程》 ——2.5 字符串的定義和操作
687
2025-04-01
2.2.2 優先使用val來避免副作用
在很多Kotlin的學習資料中,都會傳遞一個原則:優先使用val來聲明變量。這相當正確,但更好的理解可以是:盡可能采用val、不可變對象及純函數來設計程序。關于純函數的概念,其實就是沒有副作用的函數,具備引用透明性,我們會在第10章專門探討這些概念。由于后續的內容我們會經常使用副作用來描述程序的設計,所以我們先大概了解一下什么是副作用。
簡單來說,副作用就是修改了某處的某些東西,比方說:
修改了外部變量的值。
IO操作,如寫數據到磁盤。
UI操作,如修改了一個按鈕的可操作狀態。
來看個實際的例子:我們先用var來聲明一個變量a,然后在count函數內部對其進行自增操作。
var a = 1
fun count(x: Int) {
a = a + 1
println(x + a)
}
>>> count(1)
3
>>> count(1)
4
在以上代碼中,我們會發現多次調用count(1)得到的結果并不相同,顯然這是受到了外部變量 a 的影響,這個就是典型的副作用。如果我們把var換成val,然后再執行類似的操作,編譯就會報錯。
val a = 1
>>> a = a + 1
error: val cannot be ressigned
這就有效避免了之前的情況。當然,這并不意味著用val聲明變量后就不能再對該變量進行賦值,事實上,Kotlin也支持我們在一開始不定義val變量的取值,隨后再進行賦值。然而,因為引用不可變,val聲明的變量只能被賦值一次,且在聲明時不能省略變量類型,如下所示:
fun main(args: Array
val a: Int
a = 1
println(a) // 運行結果為 1
}
不難發現副作用的產生往往與可變數據及共享狀態有關,有時候它會使得結果變得難以預測。比如,我們在采用多線程處理高并發的場景,“并發訪問”就是一個明顯的例子。然而,在Kotlin編程中,我們推薦優先使用val來聲明一個本身不可變的變量,這在大部分情況下更具有優勢:
這是一種防御性的編碼思維模式,更加安全和可靠,因為變量的值永遠不會在其他地方被修改(一些框架采用反射技術的情況除外);
不可變的變量意味著更加容易推理,越是復雜的業務邏輯,它的優勢就越大。
回到在Java中進行多線程開發的例子,由于Java的變量默認都是可變的,狀態共享使得開發工作很容易出錯,不可變性則可以在很大程度上避免這一點。當然,我們說過,val只能確保變量引用的不可變,那如何保證引用對象的不可變性?你會在第6章關于只讀集合的介紹中發現一種思路。
Kotlin 編程
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。