簡體   English   中英

Kotlin:const val vs val

[英]Kotlin: const val vs val

我理解在Kotlin中const val用於聲明常量, val用於readonly屬性。 但是,我想知道以下情況,哪一個更適合使用。

假設我有一個片段需要一個密鑰用於saveInstanceStaterestoreInstanceState 我想知道以下兩個選項中哪一個更好:

選項1:

class MyFragment {
    private val MY_KEY = "my_key"
    ...
}

選項2:

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常量可能更好。

有關companion object與Java static更多信息

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM