Kotlin中的Java static final字段相当于什么?


132

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

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

Kotlin中的等效物是什么?


1
由于Kotlin中的val表示只读,因此就足够了吗?
IgorGanapolsky '17

Answers:


213

根据Kotlin 文档,这是等效的:

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

用法:

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

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

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

最后这是静态的final字段:

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

第一个示例(带有const字段)可用于属性。常见情况:在单个文件中声明所有Web api路径,并使用以下代码从控制器中引用它:“ @ RequestMapping(path = arrayOf(WebPathConstants.MapApiPath))”(Spring Boot属性)
Manushin Igor

嗨,大家好!你知道这个@JvmField是否仍然必要吗?我在android中使用它,它显示了一个不起毛的警告,说可以使用“ const”代替。我将其更改为const,使用它的java类没有任何问题。
Leandro Ocampo,

1
@LeandroOcampo,如果您有可变的静态字段,则仍然有必要const val-编译时间常数,并确保@JvmField val在某些情况下可以用作替代。如果值是在运行时计算出来的,或者不是原始类型或字符串,则无法通过它。参考文献:kotlinlang.org/docs/reference/...
鲁斯兰

36

如果您在中有实现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
}

1
最佳答案
rcorbellini

9

为了我

object Hello {
   const val MAX_LEN = 20
}

是很多样板。我像这样简单地将static final字段放在班级上方

val MIN_LENGTH = 10

class MyService{
}

2
在不需要常量在文件外部公开的情况下(即java的private),此定义最为简洁。
javaxian
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.