我已经在kotlin中写下了此方法,并分析了字节:
情况1
class A {
object b {
fun doSomething() {}
}
}
情况2
class A {
companion object b {
fun doSomething() {}
}
}
情况3
fun doSomething() {}
字节码结果
- 情况1:
Test$asb
类,public final doSomething()I
- 情况2:
Test$Companion
类,public final doSomething()I
- 情况3:
TestKt
类,public final static doSomething()I
我的问题是:
我有一个枚举类,我想在给定枚举变量的情况下返回一个枚举,例如findbyid
(enum(id, color))
。我该怎么做?伴侣对象?对象?似乎唯一的静态方法的方法是在包装级别,而没有类声明。但这变得太全球了。有什么方法可以通过以下方式访问:
ClassName.staticMethod
,staticmethod确实是静态的。提供有意义的示例,包括包装声明方法,伴随对象和对象。
上下文。我一直在Kotlin编码,我发现它很棒。但是有时我需要做出一个决定:例如,在Java中我会宣布为静态最终的沉重不变的财产,但是在Kotlin,我发现很难"找到同等的"。
如果您的功能执行与类密切相关但不需要类实例的函数,例如您的findById
示例,则应将其放在班级。
如果要将方法公开作为Java代码的静态方法,则可以使用@JvmStatic
注释进行注释。
如果函数不需要类实例,则是您的设计决定。如果特定于软件包,请使用软件包级别,请使用类Companion,如果它密切相关到类(例如,软件包中的其他类具有相似的功能)。
请注意,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)
我建议开发Voddan答案:
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")));
}