据我所知,在Kotlin中,const val
用于声明常量,而val
用于只读属性。然而,我想知道在下面的情况下,哪一个更适合使用。
假设我有一个片段,它需要一个用于saveInstanceState
和restoreInstanceState
的键。我想知道下面两个选项中哪一个更好:
选项1:
class MyFragment {
private val MY_KEY = "my_key"
...
}
选项2:
private const val MY_KEY = "my_key" // declared in the same file.
class MyFragment {
...
}
我更喜欢#选项2,因为它清楚地表明MY_KEY
是一个常量,并且值是在编译时确定的。但是,因为它是在顶层声明的,所以在编译后的java代码中创建一个名为MyFragmentKt
(假设文件名为MyFragment.kt
)的类的成本很高。在#Option1中,不会生成额外的类,尽管MY_KEY
的值将在运行时赋值,而不是常量,但在此特定情况下如何使用它并没有区别。
因此,尽管我个人更喜欢#选项2,但我的分析让我认为#选项1即使不是更好,也不会更差。我只是想知道其他开发人员是如何看待这一点的,以及#option 2是否还有其他我没有想到的好处。谢谢。
发布于 2018-02-07 10:29:55
每次编写(非内联) lambda表达式时,都会创建另一个类。与此相比,创建单个类来保存顶级声明似乎微不足道。
此外,如果你在顶层只有一个常量声明,它将被内联到每个使用站点(根据规范),因此拥有的类本身将变得不被引用,因此可以通过ProGuard的最小化来定位。它很可能不会出现在你的产品APK中。
发布于 2018-02-07 10:32:03
这两个选项之间不仅存在语义上的差异。
选项1(类中的val
)是一个实例字段。
选项2(顶级const val
)是顶级“静态”成员(大致上,因为static
在Kotlin中不存在)。
这就是生成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
常量可能更可取。
https://stackoverflow.com/questions/48661282
复制相似问题