Jaki jest odpowiednik statycznych pól końcowych Java w Kotlinie?

132

W Javie, aby zadeklarować stałą, robisz coś takiego:

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

Jaki jest odpowiednik w Kotlinie?

pdeva
źródło
1
Skoro val w Kotlin oznacza tylko do odczytu, czy to nie wystarczy?
Igor Ganapolsky

Odpowiedzi:

213

Według dokumentacji Kotlin jest to równoważne:

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

Stosowanie:

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

Jest to również statyczna właściwość końcowa (pole z funkcją pobierającą):

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

I wreszcie to jest statyczne pole końcowe:

class Hello {
    companion object {
        @JvmField val MAX_LEN = 20
    }
}
Rusłan
źródło
Pierwszy przykład (z polem const) może być użyty dla atrybutów. Popularny przypadek: zadeklaruj wszystkie ścieżki interfejsu API sieci Web w jednym pliku i odwołaj się do niego z kontrolerów za pomocą takiego kodu: „@RequestMapping (path = arrayOf (WebPathConstants.MapApiPath))” (atrybut Spring Boot)
Manushin Igor
Cześć chłopaki! Czy wiesz, czy to @JvmField jest nadal konieczne? Używam tego w Androidzie i wyświetla ostrzeżenie o kłaczkach, mówiąc, że zamiast tego można użyć „const”. Zmieniłem go na const, a klasa java, która go używa, nie ma żadnych problemów.
Leandro Ocampo
1
@LeandroOcampo jest to nadal konieczne w przypadku, gdy masz zmienne pole statyczne, const val- kompiluj stałą czasową i na pewno może być używana jako zamiennik @JvmField valw niektórych przypadkach. Dzięki temu nie działa, jeśli wartość jest obliczana w czasie wykonywania lub nie jest typem pierwotnym lub ciągiem. Ref: kotlinlang.org/docs/reference/…
Ruslan
36

jeśli masz implementację w Hello, użyj companion objectwewnątrz klasy

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

}

if Hellojest czystym obiektem singletonowym

object Hello {
  val MAX_LEN = 1 + 1
}

jeśli właściwości są stałymi czasu kompilacji, dodaj constsłowo kluczowe

object Hello {
  const val MAX_LEN = 20
}

jeśli chcesz go używać w Javie, dodaj @JvmStaticadnotację

object Hello {
  @JvmStatic val MAX_LEN = 20
}
Gary LO
źródło
1
najlepsza odpowiedź
rcorbellini
9

Dla mnie

object Hello {
   const val MAX_LEN = 20
}

było za dużo schematu. Po prostu umieszczam statyczne pola końcowe nad moją klasą w ten sposób

val MIN_LENGTH = 10

class MyService{
}
Simon Ludwig
źródło
2
W przypadkach, w których nie ma potrzeby, aby stała jest widoczna poza plikiem (np. Java private), ta definicja jest najbardziej zwięzła.
javaxian