Kotlin对象与伴侣对象与包范围方法

时间:2016-06-24 20:10:51

标签: static kotlin companion-object

我已经在Kotlin中编写了这些方法并分析了字节码:

情况1

class A {
    object b {
        fun doSomething() {}
    }
}

情况2

class A {
    companion object b {
        fun doSomething() {}
    }
}

情况3

fun doSomething() {}

字节码结果

  • 情况1:课程Test$asbpublic final doSomething()I
  • 情况2:课程Test$Companionpublic final doSomething()I
  • 情况3:课程TestKtpublic final static doSomething()I

我的问题是:

  • 我有一个枚举类,我想在给定枚举变量的情况下返回一个枚举实例,例如findById (enum(id, color))。我该怎么办?伴侣对象?对象

  • 看起来真正的静态方法的唯一方法是在包级别,没有类声明。但这有点过于全球化。有没有办法通过以下方式访问它:ClassName.staticMethod,staticMethod非常静态。

  • 提供包声明方法,伴随对象和对象的有意义的示例。

上下文。我一直在Kotlin编码,我发现它很棒。但有时我需要做出决定:例如,一个沉重的不可变属性在java中我会声明为静态final,但在Kotlin中我发现很难“找到一个等价物”。

3 个答案:

答案 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")));
}