【问题标题】:What is the equivalent of Java static final fields in Kotlin?Kotlin 中 Java 静态最终字段的等价物是什么?
【发布时间】:2016-11-01 01:20:55
【问题描述】:

在 Java 中,要声明一个常量,您可以执行以下操作:

class Hello {
    public static final int MAX_LEN = 20;
}

Kotlin 中的等价物是什么?

【问题讨论】:

  • 既然 Kotlin 中的 val 意味着只读,那还不够吗?

标签: java kotlin


【解决方案1】:

根据 Kotlin documentation,这是等价的:

class Hello {
    companion object {
        const val MAX_LEN = 20
    }
}

用法:

fun main(srgs: Array<String>) {
    println(Hello.MAX_LEN)
}

这也是静态最终属性(带有 getter 的字段):

class Hello {
    companion object {
        @JvmStatic val MAX_LEN = 20
    }
}

最后这是静态最终字段:

class Hello {
    companion object {
        @JvmField val MAX_LEN = 20
    }
}

【讨论】:

  • 第一个示例(带有 const 字段)可用于属性。流行案例:在单个文件中声明所有 Web api 路径,并使用以下代码从控制器中引用它:“@RequestMapping(path = arrayOf(WebPathConstants.MapApiPath))”(Spring Boot 属性)
  • 大家好!你知道这个@JvmField 是否仍然需要吗?我在 android 中使用它,它显示一个 lint 警告,说可以使用“const”。我把它改成 const 并且使用它的 java 类没有任何问题。
  • @LeandroOcampo 如果您有可变静态字段 const val - 编译时间常数,并且在某些情况下它可以用作 @JvmField val 的替代品,它仍然是必要的。如果值 - 在运行时计算,或者它不是原始类型或字符串,则通过它不起作用。参考:kotlinlang.org/docs/reference/…
【解决方案2】:

如果您在 Hello 中有实现,请在类中使用 companion object

class Hello {
  companion object {
    val MAX_LEN = 1 + 1
  }

}

如果Hello 是纯单例对象

object Hello {
  val MAX_LEN = 1 + 1
}

如果属性是编译时常量,请添加 const 关键字

object Hello {
  const val MAX_LEN = 20
}

如果你想在Java中使用,添加@JvmStatic注解

object Hello {
  @JvmStatic val MAX_LEN = 20
}

【讨论】:

  • 最佳答案
【解决方案3】:

对我来说

object Hello {
   const val MAX_LEN = 20
}

是太多样板。我像这样简单地将静态最终字段放在我的类上方

private val MIN_LENGTH = 10 // <-- The `private` scopes this variable to this file. Any class in the file has access to it.

class MyService{
}

【讨论】:

  • 在不需要将常量暴露在文件外的情况下(即java的private),这种定义最为简洁。
猜你喜欢
  • 2017-03-14
  • 1970-01-01
  • 2011-03-17
  • 1970-01-01
  • 1970-01-01
  • 2016-04-10
  • 1970-01-01
  • 2017-10-29
相关资源
最近更新 更多