Який еквівалент статичних кінцевих полів Java в Котліні?


132

У Java, щоб оголосити константу, ви робите щось на кшталт:

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

Який еквівалент у Котліні?


1
Оскільки Val у Котліні конотує лише читання, чи не буде цього достатньо?
ІгорГанапольський

Відповіді:


213

Згідно з документацією Котліна, це рівнозначно:

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) може бути використаний для атрибутів. Популярний випадок: оголосити всі шляхи веб-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's private), це визначення є найбільш стислим.
javaxian
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.