![](/img/trans.png)
[英]What is the type of 'const val num = 1' of Kotlin? And how are they able to define it?
[英]Kotlin: const val vs val
我理解在Kotlin中const val
用於聲明常量, val
用於readonly屬性。 但是,我想知道以下情況,哪一個更適合使用。
假設我有一個片段需要一個密鑰用於saveInstanceState
和restoreInstanceState
。 我想知道以下兩個選項中哪一個更好:
class MyFragment {
private val MY_KEY = "my_key"
...
}
private const val MY_KEY = "my_key" // declared in the same file.
class MyFragment {
...
}
我更喜歡#option 2,因為它清楚地表明MY_KEY
是一個常量,並且值是在編譯時確定的。 但是,由於它是在頂層聲明的,因此需要在編譯的java代碼中創建一個類,即MyFragmentKt
(假設文件名是MyFragment.kt
)。 在#option 1中,沒有生成額外的類,雖然MY_KEY
的值將在運行時分配而不是常量,但在這種特定情況下它的使用方式沒有區別。
所以雖然我個人更喜歡#option 2,但我的分析讓我覺得#option 1並不差,如果不是更好的話。 我只是想知道其他開發人員如何考慮這個問題以及#option 2是否還有其他任何我沒有想過的好處。 謝謝。
每次編寫(非內聯)lambda表達式時,都創建了另一個類。 與此相比,創建一個用於保存頂級聲明的類似乎很小。
此外,如果您在頂層的所有內容都是一個常量聲明,它將被內聯到每個使用站點(按規范),因此擁有類本身將變為未引用,因此可通過ProGuard的最小化來定位。 它很可能不會出現在你的制作APK中。
這兩個選項之間不僅存在語義差異。
選項1(類中的val
)是一個實例字段。
選項2(頂級const val
)是頂級“靜態”成員(粗略地說,因為Kotlin中不存在static
)。
這就是生成MyFragmentKt
類的原因:頂級成員被編譯為名為[Filename]Kt
。
我會考慮第三種選擇:
class MyFragment {
companion object {
private const val MY_KEY = "my_key"
}
}
這樣, MY_KEY
(來自Java)是MyFragment
類的static
成員,因為JvmStatic
是為const
變量推斷的。 將生成一個Companion
類(但它將為空)。
由於你的原始方法是類中的一個字段,我覺得companion object
/ static
常量可能更好。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.