kotlin对象与伴侣对象vs软件包范围范围的方法



我已经在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")));
}

相关内容

  • 没有找到相关文章

最新更新