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() {}

字节码结果

我的问题是:

上下文。我一直在用 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")));
}