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?

pdeva
la source
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
    }
}
Ruslan
la source
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
}
Gary LO
la source
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{
}
Simon Ludwig
la source
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