Was entspricht den statischen Java-Endfeldern in Kotlin?

132

Um in Java eine Konstante zu deklarieren, gehen Sie wie folgt vor:

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

Was ist das Äquivalent in Kotlin?

pdeva
quelle
1
Wäre es nicht ausreichend, da val in Kotlin schreibgeschützt bedeutet?
IgorGanapolsky

Antworten:

212

Laut Kotlin- Dokumentation ist dies äquivalent:

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

Verwendung:

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

Dies ist auch eine statische endgültige Eigenschaft (Feld mit Getter):

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

Und schließlich ist dies das statische Endfeld:

class Hello {
    companion object {
        @JvmField val MAX_LEN = 20
    }
}
Ruslan
quelle
Das erste Beispiel (mit const-Feld) kann für Attribute verwendet werden. Beliebter Fall: Deklarieren Sie alle Web-API-Pfade in der einzelnen Datei und verweisen Sie von Controllern mit folgendem Code darauf: "@RequestMapping (path = arrayOf (WebPathConstants.MapApiPath))" (Spring Boot-Attribut)
Manushin Igor
Hallo Leute! Wissen Sie, ob dieses @JvmField noch notwendig ist? Ich benutze dies in Android und es zeigt eine Flusenwarnung, die besagt, dass stattdessen "const" verwendet werden kann. Ich habe es in const geändert und die Java-Klasse, die es verwendet, hat keine Probleme.
Leandro Ocampo
1
@LeandroOcampo ist es immer noch erforderlich, wenn Sie ein veränderbares statisches Feld haben, const val- die Zeitkonstante kompilieren und es @JvmField valin einigen Fällen sicher als Ersatz verwenden kann . Durch es funktioniert nicht, wenn Wert - in der Laufzeit berechnet, oder es nicht primitiven Typ oder String. Ref: kotlinlang.org/docs/reference/…
Ruslan
36

Wenn Sie eine Implementierung in haben Hello, verwenden Sie diese companion objectinnerhalb einer Klasse

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

}

if Helloist ein reines Singleton-Objekt

object Hello {
  val MAX_LEN = 1 + 1
}

Wenn es sich bei den Eigenschaften um Konstanten zur Kompilierungszeit handelt, fügen Sie ein constSchlüsselwort hinzu

object Hello {
  const val MAX_LEN = 20
}

Wenn Sie es in Java verwenden möchten, fügen Sie eine @JvmStaticAnmerkung hinzu

object Hello {
  @JvmStatic val MAX_LEN = 20
}
Gary LO
quelle
1
die beste Antwort
rcorbellini
9

Für mich

object Hello {
   const val MAX_LEN = 20
}

war zu viel Boilerplate. Ich setze die statischen Endfelder einfach so über meine Klasse

val MIN_LENGTH = 10

class MyService{
}
Simon Ludwig
quelle
2
In den Fällen, in denen die Konstante nicht außerhalb der Datei verfügbar gemacht werden muss (z. B. Java private), ist diese Definition am präzisesten.
Javaxian