有一个很好的理由(表现方面)来取代:
val SOME_CONST = "value"
带
companion object {
val SOME_CONST = "value"
}
添加@JvmStatic
注释是否会改变结果?
答案 0 :(得分:12)
是的,val
中存储的companion object
效率更高。您可以使用Kotlin bytecode viewer找出编译到这些选项的内容。
以下是我注意到可能影响性能的事情:
伴随对象val
只存储一次,与实例val
不同,后者实际存储在每个实例中,从而增加了实例内存占用量(String
文字{{3}但是,实例将引用它)和实例创建时间(在构造期间,必须填写一个字段)。
连续多次访问协同对象val
在CPU缓存方面比在不同实例中使用val
效果更好:它具有更好的is stored in constant pool。取消引用不同的实例来访问其中的val
可能会导致CPU缓存未命中,这对性能不利。
但是,如果val
仅在同一类的实例方法中使用,则描述的效果几乎不会影响性能,因为无论如何这些方法都可能取消引用this
,这甚至可能更好,访问伴随对象时不会导致可能的缓存未命中。
添加locality of reference使访问速度更快一些。没有它,访问该值需要获取静态Companion
引用并在其上调用getSOME_CONST()
。使用@JvmStatic
,将会有静态方法getSOME_CONST()
(跳过Companion
)。还有@JvmStatic
,它可以直接访问公共字段,甚至无需调用getter。
但JIT编译器可能会优化前两种情况的getter访问,因此注释的效果几乎不会引起注意。
此外,除了性能之外,实例val
具有可能对每个实例都不同的值的语义,因此companion object
似乎更适合全局常量值的情况。