Quel est l'équivalent des champs finaux statiques Java dans Kotlin?


132

En Java, pour déclarer une constante, vous faites quelque chose comme:

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

Quel est l'équivalent à Kotlin?


1
Puisque val dans Kotlin signifie lecture seule, cela ne suffirait-il pas?
IgorGanapolsky

Réponses:


213

Selon la documentation de Kotlin , c'est équivalent:

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

Usage:

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

Il s'agit également d'une propriété finale statique (champ avec getter):

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

Et enfin c'est le champ final statique:

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

Le premier exemple (avec le champ const) peut être utilisé pour les attributs. Cas populaire: déclarez tous les chemins de l'API Web dans le fichier unique et référencez-le à partir des contrôleurs avec un tel code: "@RequestMapping (path = arrayOf (WebPathConstants.MapApiPath))" (attribut Spring Boot)
Manushin Igor

Salut les gars! Savez-vous si ce @JvmField est toujours nécessaire? J'utilise ceci dans Android et il affiche un avertissement de peluche indiquant que "const" peut être utilisé à la place. Je l'ai changé en const et la classe java qui l'utilise n'a aucun problème.
Leandro Ocampo

1
@LeandroOcampo c'est toujours nécessaire dans le cas où vous avez un champ statique mutable, const val- compilez la constante de temps et à coup sûr, elle peut être utilisée en remplacement @JvmField valdans certains cas. Cela ne fonctionne pas si la valeur est calculée au moment de l'exécution, ou si ce n'est pas un type primitif ou une chaîne. Ref: kotlinlang.org/docs/reference/…
Ruslan

36

si vous avez une implémentation dans Hello, utilisez companion objectdans une classe

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

}

if Helloest un pur objet singleton

object Hello {
  val MAX_LEN = 1 + 1
}

si les propriétés sont des constantes à la compilation, ajoutez un constmot - clé

object Hello {
  const val MAX_LEN = 20
}

si vous souhaitez l'utiliser en Java, ajoutez une @JvmStaticannotation

object Hello {
  @JvmStatic val MAX_LEN = 20
}

1
la meilleure réponse
rcorbellini

9

Pour moi

object Hello {
   const val MAX_LEN = 20
}

était trop passe-partout. Je mets simplement les champs finaux statiques au-dessus de ma classe comme ceci

val MIN_LENGTH = 10

class MyService{
}

2
Dans les cas où vous n'avez pas besoin que la constante soit exposée en dehors du fichier (ie. Java private), cette définition est la plus concise.
javaxian
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.