Kotlin核心編程》 ——2.2.2 優先使用val來避免副作用

      網友投稿 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聲明的變量只能被賦值一次,且在聲明時不能省略變量類型,如下所示:

      《Kotlin核心編程》 ——2.2.2 優先使用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小時內刪除侵權內容。

      上一篇:操作系統——內存管理
      下一篇:FTP上傳錯誤詳解
      相關文章
      亚洲精品无码av人在线观看| 亚洲欧美日韩自偷自拍| 久久久久se色偷偷亚洲精品av| 色偷偷亚洲第一综合| 国产精品亚洲专区在线观看 | 91亚洲国产成人久久精品| 亚洲伊人tv综合网色| 亚洲AV日韩AV永久无码久久| 亚洲av无码一区二区三区不卡| 亚洲一区二区三区免费| 国产综合亚洲专区在线| 亚洲乱码中文字幕手机在线 | avtt天堂网手机版亚洲| 亚洲人成图片网站| 亚洲人成色777777精品| 国产精品亚洲精品久久精品| 国产成人精品亚洲一区| 亚洲av手机在线观看| 亚洲爽爽一区二区三区| 亚洲无线观看国产精品| 国产偷v国产偷v亚洲高清| 亚洲AV无码久久精品色欲| 91亚洲va在线天线va天堂va国产| 亚洲网站在线免费观看| 2020天堂在线亚洲精品专区| 亚洲精品伦理熟女国产一区二区| 亚洲精品无码av中文字幕| 亚洲国产精华液2020| 深夜国产福利99亚洲视频| 在线观看亚洲成人| 久久久无码精品亚洲日韩蜜桃 | 亚洲高清在线mv| 色婷五月综激情亚洲综合| 亚洲AV无码一区二区三区性色| 亚洲成?Ⅴ人在线观看无码| 奇米影视亚洲春色| 亚洲成人免费在线| 亚洲人成网站看在线播放| 亚洲国产欧洲综合997久久| 亚洲精品国产日韩无码AV永久免费网 | 久久久久亚洲AV片无码|