【发布时间】:2019-11-29 10:58:05
【问题描述】:
Java 中有许多不可变的类,例如 String 和原始包装类,Kotlin 引入了许多其他类,例如 Range 子类和不可变的 Collection 子类。
对于Ranges,我们已经知道从Control Flow: if, when, for, while - Kotlin Programming Language迭代:
在范围或数组上的
for循环被编译为不创建迭代器对象的基于索引的循环。
但是在处理Ranges 的其他情况下,这种优化是不可能的。
当使用 const 参数创建此类不可变类时,或者更一般地,使用 const 参数递归创建类时,只实例化一次类将带来性能提升。 (换句话说,如果我们称其为 const 不可变实例化,则当且仅当它的所有参数都是常量或 const 不可变实例化时,实例化才是 const 不可变实例化。)因为 Java 编译器没有一种机制来知道是否一个类是不可变的,Kotlin 编译器是否会根据其已知的不可变类的知识将此类类优化为只实例化一次?
对于更具体的应用示例,请考虑以下代码:
repeat(1024) {
doSomething(('a'..'z').random())
}
val LOWERCASE_ALPHABETS = 'a'..'z'
repeat(1024) {
doSomething(LOWERCASE_ALPHABETS.random())
}
第二个会带来性能提升吗?
【问题讨论】:
-
Kotlin 会将许多范围优化为正常的 for 循环,避免范围对象的实例化。我不知道在这些情况下是否会发生这种情况,但我认为它会发生。
标签: java kotlin constants immutability kotlinc