android - Kotlin:const val 与 val

标签 android kotlin

我理解在 Kotlin 中 const val 用于声明常量,而 val 用于只读属性。但是,我想知道在以下情况下,哪个更适合使用。

假设我有一个 fragment 需要一个用于 saveInstanceStaterestoreInstanceState 的 key 。我想知道以下 2 个选项中哪一个更好:

选项 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 中。

关于android - Kotlin:const val 与 val,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48661282/

相关文章:

android - 升级时如何检测以前安装的应用程序的版本名称

android - fragment ,在onSaveInstanceState上保存大数据列表(如何防止TransactionTooLargeException)

Android:如何使用动态 TextView 为不同的屏幕尺寸设置不同的文本尺寸?

android - 在按钮上同时使用 setOnTouchListener 和 setOnClickListener

java - 在 Kotlin 中识别自定义类

java - android音乐播放器获取上次播放列表

java - 获取 ListView 中edittext的值

data-binding - 类型推断失败 : Not enough information to infer parameter Please specify it explicitly

maven - 如何为基于 maven 的 Kotlin 项目启用显式 API 模式?

java - 将属性绑定(bind)到从 JavaFx/TornadoFX 控件派生的值的正确方法