Kotlin 对象 vs 伴随对象 vs 包作用域方法
Kotlin object vs companion-object vs package scoped methods
我用Kotlin写了这个方法,分析了字节码:
情况一
class A {
object b {
fun doSomething() {}
}
}
情况2
class A {
companion object b {
fun doSomething() {}
}
}
情况三
fun doSomething() {}
字节码结果
- 情况一:class
Test$asb
,public final doSomething()I
- 情况二:class
Test$Companion
,public final doSomething()I
- 情况三:class
TestKt
,public final static doSomething()I
我的问题是:
我有一个枚举 class,我想 return 一个给定枚举变量的枚举实例,例如 findById (enum(id, color))
。我该怎么做?伴生对象?对象?
似乎拥有真正静态方法的唯一方法是在包级别,没有 class 声明。但这变得有点过于全球化了。有什么方法可以通过以下方式访问它:ClassName.staticMethod
,staticMethod 是真正静态的。
提供包声明方法、伴随对象和对象的有意义的示例。
上下文。我一直在用 Kotlin 编码,我发现它很棒。但有时我需要做出决定:例如,一个沉重的不可变 属性 在 java 中我会声明为 static final,但在 Kotlin 中我发现很难 "find an equivalent".
如果您有一个函数执行某些与 class 密切相关但不需要 class 实例的函数,例如您的 findById
示例,您应该将其放入在 class.
的伴生对象中
如果要将方法作为静态方法公开给 Java 代码,可以使用 @JvmStatic
注释对其进行注释。
如果函数不需要 class 的实例,那么将它放在哪里是您的设计决定。如果它是特定于包的,则使用包级别,如果它与 class 密切相关,则使用 class 伴侣(例如,包中的其他 classes 具有类似的功能)。
请注意 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)
我建议开发 :
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")));
}
我用Kotlin写了这个方法,分析了字节码:
情况一
class A {
object b {
fun doSomething() {}
}
}
情况2
class A {
companion object b {
fun doSomething() {}
}
}
情况三
fun doSomething() {}
字节码结果
- 情况一:class
Test$asb
,public final doSomething()I
- 情况二:class
Test$Companion
,public final doSomething()I
- 情况三:class
TestKt
,public final static doSomething()I
我的问题是:
我有一个枚举 class,我想 return 一个给定枚举变量的枚举实例,例如 findById
(enum(id, color))
。我该怎么做?伴生对象?对象?似乎拥有真正静态方法的唯一方法是在包级别,没有 class 声明。但这变得有点过于全球化了。有什么方法可以通过以下方式访问它:
ClassName.staticMethod
,staticMethod 是真正静态的。提供包声明方法、伴随对象和对象的有意义的示例。
上下文。我一直在用 Kotlin 编码,我发现它很棒。但有时我需要做出决定:例如,一个沉重的不可变 属性 在 java 中我会声明为 static final,但在 Kotlin 中我发现很难 "find an equivalent".
如果您有一个函数执行某些与 class 密切相关但不需要 class 实例的函数,例如您的 findById
示例,您应该将其放入在 class.
如果要将方法作为静态方法公开给 Java 代码,可以使用 @JvmStatic
注释对其进行注释。
如果函数不需要 class 的实例,那么将它放在哪里是您的设计决定。如果它是特定于包的,则使用包级别,如果它与 class 密切相关,则使用 class 伴侣(例如,包中的其他 classes 具有类似的功能)。
请注意 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)
我建议开发
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")));
}