【问题标题】:Kotlin object vs companion-object vs package scoped methodsKotlin 对象 vs 伴生对象 vs 包作用域方法
【发布时间】:2016-06-24 20:10:51
【问题描述】:

我在 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 中我会声明为 static final 的重的不可变属性,但在 Kotlin 中我发现很难“找到等价物”。

【问题讨论】:

标签: static kotlin companion-object


【解决方案1】:

如果您有一个执行与类密切相关的操作但不需要类实例的函数,例如您的 findById 示例,您应该将它放在类的伴随对象中。

如果要将方法作为静态方法公开给 Java 代码,可以使用 @JvmStatic 注释对其进行注释。

【讨论】:

    【解决方案2】:

    如果一个函数不需要类的实例,那么将它放在哪里是您的设计决定。如果它是特定于包的,则使用包级别,如果它与类密切相关,则使用类伴侣(例如,包中的其他类具有类似的功能)。

    请注意,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)
    

    【讨论】:

      【解决方案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")));
      }
      

      【讨论】:

      • 为什么不直接从Color类调用呢? println(Color.findById(Color.valueOf("RED")));
      猜你喜欢
      • 2018-02-06
      • 2019-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-21
      • 1970-01-01
      • 2013-07-05
      相关资源
      最近更新 更多