【发布时间】:2016-11-01 01:20:55
【问题描述】:
在 Java 中,要声明一个常量,您可以执行以下操作:
class Hello {
public static final int MAX_LEN = 20;
}
Kotlin 中的等价物是什么?
【问题讨论】:
-
既然 Kotlin 中的 val 意味着只读,那还不够吗?
在 Java 中,要声明一个常量,您可以执行以下操作:
class Hello {
public static final int MAX_LEN = 20;
}
Kotlin 中的等价物是什么?
【问题讨论】:
根据 Kotlin documentation,这是等价的:
class Hello {
companion object {
const val MAX_LEN = 20
}
}
用法:
fun main(srgs: Array<String>) {
println(Hello.MAX_LEN)
}
这也是静态最终属性(带有 getter 的字段):
class Hello {
companion object {
@JvmStatic val MAX_LEN = 20
}
}
最后这是静态最终字段:
class Hello {
companion object {
@JvmField val MAX_LEN = 20
}
}
【讨论】:
const val - 编译时间常数,并且在某些情况下它可以用作 @JvmField val 的替代品,它仍然是必要的。如果值 - 在运行时计算,或者它不是原始类型或字符串,则通过它不起作用。参考:kotlinlang.org/docs/reference/…
如果您在 Hello 中有实现,请在类中使用 companion object
class Hello {
companion object {
val MAX_LEN = 1 + 1
}
}
如果Hello 是纯单例对象
object Hello {
val MAX_LEN = 1 + 1
}
如果属性是编译时常量,请添加 const 关键字
object Hello {
const val MAX_LEN = 20
}
如果你想在Java中使用,添加@JvmStatic注解
object Hello {
@JvmStatic val MAX_LEN = 20
}
【讨论】:
对我来说
object Hello {
const val MAX_LEN = 20
}
是太多样板。我像这样简单地将静态最终字段放在我的类上方
private val MIN_LENGTH = 10 // <-- The `private` scopes this variable to this file. Any class in the file has access to it.
class MyService{
}
【讨论】:
private),这种定义最为简洁。