Kotlin 有一個非常強大的型態推斷系統。在多數情況下,不需要明確地指定變數的型別,因為編譯器可以從給定的值或表達式中推斷出來,非常的貼心跟聰明
val num = 10
val name = "Marcin"
val ids = listOf(12, 112, 554, 997)
這個強大的功能不僅開發時間得到改善,當型別從上下文中清晰可見,且額外的指定變得多餘且混亂時,可讀性也會提高。然而,在型別不明確的情況下,不應過度使用。在某些情況下,沒有明確的型別,程式碼可能會變得模糊或容易誤解。
val data = getSomeData()
我們為了可讀性而設計我們的程式碼,我們不應該隱藏對讀者來說可能很重要的資訊。因為開發者可能要花時間跳入 function 原始碼來查看,這並不合理。此外,使用者可能在 GitHub 或其他不支持跳入的環境中閱讀此程式碼,例如 PR (假定大家都有認真看 PR XD)。即使可以,我們所有人的工作記憶都非常有限,如此浪費它不是一個好主意。型別是重要的資訊,如果它不清楚,應該指定它。
val data: UserData = getSomeData()
提高可讀性並不是指定型別的唯一理由。正如在前面幾天:安全性中所示,它也是為了安全,在項目3:儘快消除平台類型和項目4:不要暴露推斷的型別。型別可能是開發者和編譯器都很重要的資訊。無論何時,都不要猶豫指定型別。它的成本很低,但可以提供很大的幫助。
當使用集合初始化函數(例如 listOf、mapOf 等)而不提供具體元素時,應該明確指定集合的型別。
// 不太清楚的
val numbers: List<Int> = listOf()
// 與上面相比,這個是更清楚的
val numbers = listOf<Int>()
當 lambda 表達式的參數型別不能被清楚地推斷時,最好明確指定它。
val stringList = listOf("A", "B", "C")
// 較不明確
stringList.forEach { item -> println(item.toLowerCase()) }
// 較明確
stringList.forEach { item: String -> println(item.toLowerCase()) }
雖然在這個例子中,型別推斷很明確(因為 stringList 是一個 String 的列表),但在更複雜的情境中,明確指定參數的型別可能會有所幫助。
如果函數的返回值不能直觀地從其實現中推斷出來,則應明確指定返回值的型別。
fun getValue(): Int {
return someComplexLogic()
}
總的來說,當 Kotlin 中的變數、函數返回值或 lambda 參數的型別不清楚或難以推斷時,最好明確指定它。這有助於提高程式碼的可讀性和維護性。
Senorita