Что эквивалентно статическим конечным полям Java в Котлине?

132

В Java, чтобы объявить константу, вы делаете что-то вроде:

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

Что эквивалентно в Котлине?

pdeva
источник
1
Поскольку val в Kotlin означает только чтение, разве этого не достаточно?
Игорь Ганапольский

Ответы:

213

Согласно документации Kotlin, это эквивалентно:

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

Использование:

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

Также это статическое свойство final (поле с геттером):

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

И наконец, это статическое финальное поле:

class Hello {
    companion object {
        @JvmField val MAX_LEN = 20
    }
}
Руслан
источник
Первый пример (с полем const) можно использовать для атрибутов. Популярный случай: объявить все пути веб-api в одном файле и ссылаться на него с контроллеров с помощью такого кода: «@RequestMapping (path = arrayOf (WebPathConstants.MapApiPath))» (атрибут Spring Boot)
Манушин Игорь
Привет, ребята! Вы знаете, нужен ли этот @JvmField? Я использую это в android, и он показывает предупреждение о том, что вместо него можно использовать «const». Я изменил его на const, и у того java-класса, который его использует, нет никаких проблем.
Леандро Окампо
1
@LeandroOcampo это все равно необходимо в случае, если у вас есть изменяемое статическое поле, const val- константа времени компиляции и наверняка может использоваться в качестве замены @JvmField valв некоторых случаях. Через него не работает, если значение - вычисленное во время выполнения, или это не примитивный тип или String. Ссылка: 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
}

был слишком шаблонным. Я просто помещаю статические конечные поля над моим классом следующим образом

val MIN_LENGTH = 10

class MyService{
}
Саймон Людвиг
источник
2
В тех случаях, когда вам не нужно, чтобы константа открывалась вне файла (например, java private), это определение является наиболее кратким.
javaxian