我理解在Kotlin const val
中用于声明常量并且val
用于只读属性.但是,我想知道以下情况,哪一个更适合使用.
假设我有一个片段需要一个密钥用于saveInstanceState
和restoreInstanceState
.我想知道以下两个选项中哪一个更好:
class MyFragment {
private val MY_KEY = "my_key"
...
}
Run Code Online (Sandbox Code Playgroud)
private const val MY_KEY = "my_key" // declared in the same file.
class MyFragment {
...
}
Run Code Online (Sandbox Code Playgroud)
我更喜欢#option 2,因为它清楚地表明它MY_KEY
是一个常量,并且值是在编译时确定的.但是,由于它是在顶层声明的,因此它需要在编译的java代码中创建一个类,即MyFragmentKt
(假设文件名是MyFragment.kt
).在#option 1中,没有生成额外的类,虽然它MY_KEY
的值将在运行时分配而不是常量,但在这种特定情况下它的使用方式没有区别.
所以虽然我个人更喜欢#option 2,但我的分析让我觉得#option 1并不差,如果不是更好的话.我只是想知道其他开发人员如何考虑这个问题以及#option 2是否还有其他任何我没有想过的好处.谢谢.
Mar*_*nik 19
每次编写(非内联)lambda表达式时,都创建了另一个类.与此相比,创建一个用于保存顶级声明的类似乎很小.
此外,如果你有在顶层是一个常量声明,它会内联到每个使用地点(通过规范),因此拥有的类本身将成为ProGuard的的最小化未引用的,因此靶向.它很可能不会出现在你的制作APK中.
Moi*_*ira 13
这两个选项之间不仅存在语义差异.
选项1(val
在类中)是一个实例字段.
选项2(顶级const val
)是顶级"静态"成员(粗略地说,因为static
在Kotlin中不存在.)
这就是MyFragmentKt
生成类的原因:顶级成员被编译成名称的类[Filename]Kt
.
我会考虑第三种选择:
class MyFragment {
companion object {
private const val MY_KEY = "my_key"
}
}
Run Code Online (Sandbox Code Playgroud)
这样,MY_KEY
(来自Java)是类的static
成员MyFragment
,因为它JvmStatic
是为const
变量推断的.将Companion
生成一个类(但它将为空).
由于你的原始方法是类中的一个字段,我觉得companion object
/ static
常量可能更好.
更多关于companion object
s vs Java的信息static
归档时间: |
|
查看次数: |
8677 次 |
最近记录: |