iT邦幫忙

2022 iThome 鐵人賽

DAY 2
0
自我挑戰組

Kotlin 隨寫系列 第 2

Kotlin 的 Value Class ,再見了 type alias

  • 分享至 

  • xImage
  •  

https://ithelp.ithome.com.tw/upload/images/20220917/20135701zq3pgqqVfr.png

Kotlin 在 1.5 發表了 value classes。在 Kotlin 已經有 typealias , data class 的情況下為什麼還需要 value class 呢。

Value Class 要解決什麼問題

用 Class 可以解決兩個問題,1. 讓你的 Type 有意義 2. 確保 type-safety。而原始型別也是有 type safe 的保證,但無法保證他的意義,例如溫度的華式(℃)跟攝式(℉)都是 Double

https://ithelp.ithome.com.tw/upload/images/20220917/20135701Do7HjtM27R.png

所以在這之前 Kotlin 有幾種解法,一個是 type alias, 但是這個就真的只是別名,並不能的在 compiler time 保證。

typealias TemperatureC = Double
typealias TemperatureF = Double
fun isTheTemperatureHot(temperatureC: TemperatureC) { ... }
fun callingFunction() {
    val tempF: TemperatureF = 100
    isTheTemperatureHot(weight)
}

有這麼嚴重嗎

是還是真的有這麼嚴重,歷史上有一台火星氣候探測者號,在降落時失敗,最後 root cause 是單位錯誤,因為火星氣候探測者號上的飛行系統使用公制單位牛頓計算推進器動力,而地面人員輸入的方向校正量和推進器參數則使用英制單位磅力,所以就 GG 惹

所以如果我們有 value class, 在不同的 value class 即使同是 double 也不能直接拿來用。

@JvmInline
value class TemperatureC(val value: Double)
fun isTheTemperatureHot(temperatureC: TemperatureC) { ... }
fun callingFunction() {
    val tempF: TemperatureF(100)
    isTheTemperatureHot(tempF) // not compileed
}

編譯期優化

Value Class 提高了程式碼的可讀性及型別保證,並且在 compile 時,Kotlin 會還原成原始型別。所以效率是很高的。

我還你原型

參考資料


上一篇
Day1 - Kotlin 的語言原則 - 務實
下一篇
Arrow KT - Either Monad
系列文
Kotlin 隨寫3
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言