我已经在Kotlin中编写了这些方法并分析了字节码:
class A {
object b {
fun doSomething() {}
}
}
class A {
companion object b {
fun doSomething() {}
}
}
fun doSomething() {}
字节码结果
Test$asb
,public final doSomething()I
Test$Companion
,public final doSomething()I
TestKt
,public final static doSomething()I
我的问题是:
我有一个枚举类,我想在给定枚举变量的情况下返回一个枚举实例,例如findById (enum(id, color))
。我该怎么办?伴侣对象?对象
看起来真正的静态方法的唯一方法是在包级别,没有类声明。但这有点过于全球化。有没有办法通过以下方式访问它:ClassName.staticMethod
,staticMethod非常静态。
提供包声明方法,伴随对象和对象的有意义的示例。
上下文。我一直在Kotlin编码,我发现它很棒。但有时我需要做出决定:例如,一个沉重的不可变属性在java中我会声明为静态final,但在Kotlin中我发现很难“找到一个等价物”。
答案 0 :(得分:9)
如果你有一个函数可以执行与某个类密切相关的操作,但不需要类实例,例如你的findById
示例,则应该将它放在类的伴随对象中。
如果要将方法作为静态方法公开给Java代码,可以使用@JvmStatic
注释对其进行注释。
答案 1 :(得分:6)
如果一个函数不需要类的实例,那么你的设计决定在哪里放置它。如果它是特定于包的,请使用包级别,如果它与类紧密相关,则使用类伴侣(例如,包中的其他类具有类似的功能)。
请注意enum
有几个内置属性和模式:
enum class Colour(val value: Int) {
black(100), red(200), green(300)
}
fun colourById(id: Int) = Colour.values[id]
fun colourByValue(value: Int) = Colour.values.first {it.value == value}
fun colourByName(name: String) = Colour.valueOf(name)
答案 2 :(得分:3)
我建议开发voddan answer:
enum class Color {
RED,
BLUE,
GREEN;
companion object Utils {
fun findById(color: Color): Color {
return color;
}
}
}
并测试
@Test
fun testColor() {
println(Color.Utils.findById(Color.valueOf("RED")));
}