我用Kotlin编写了这个方法,并分析了字节码:

Situation 1

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

Situation 2

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

Situation 3

fun doSomething() {}

Bytecode Result

  • Situation 1: class Test$asb, public final doSomething()I
  • 情景2:Test$Companionpublic final doSomething()I
  • Situation 3: class TestKt, public final static doSomething()I

我的问题是:

  • I have an enum class, and I want to return an enum instace given an enum variable, for instance, findById (enum(id, color)). How would I do it? Companion Object? object?

  • 似乎拥有真正静态方法的唯一方法是在包级别,而不需要类声明.但这变得有点太全球化了.有没有办法通过ClassName.staticMethod访问它,staticMethod实际上是静态的.

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

上下文.我一直在用Kotlin 编写代码,我发现它很棒.但有时我需要做出决定:例如,一个沉重的不可变属性,在java中我会将其声明为静电最终属性,但在kotlin中,我发现很难"找到对应的属性".

推荐答案

我建议开发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")));
}

Kotlin相关问答推荐

文本正在被切断在200%的屏幕比例在Jetpack Compose

Kotlin和JavaFX:绑定行为奇怪

Gradle Jooq配置自定义生成器

新的jOOQ Gradle插件无法正确处理自引用关系

为什么多线程不会使执行更快

从 HashMap 检索时的 NPE,即使 containsKey() 在多线程环境中返回 true

如何限制 Kotlin 中的枚举?

Kotlin 具体类从抽象类和接口扩展而来,接口使用抽象类中实现的方法

如何在 Kotlin 中使用具有继承的泛型

找不到引用的类 kotlin.internal.annotations.AvoidUninitializedObjectCopyingCheck

Kotlin-Java 互操作不能与可变参数一起使用

Kotlin解构when/if语句

Kotlin reflect proguard SmallSortedMap

在kotlin中初始化类变量的正确位置是什么

如何在Kotlin中使方法param可变?

如何将 CameraView 与 Jetpack Compose 一起使用?

在Kotlin中创建通用二维数组

从另一个列表创建一个列表

Kotlin:获取文件的扩展名,例如.txt

Kotlin - 为什么我会得到 KotlinNullPointerException