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?


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
    }
}

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
}

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{
}

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.