Pourquoi Kotlin ne permet-il pas d'utiliser lateinit avec des types primitifs?
dans la langue Kotlin, nous, par défaut, devons initialiser chaque variable lorsqu'elle est introduite. Pour éviter cela, le lateinit
mot-clé peut être utilisé. En se référant à un lateinit
variable avant qu'elle ait été initialisée donne une exception d'exécution.
lateinit
ne peut pas, cependant, être utilisé avec les types primitifs. Pourquoi est-il si?
2 réponses
pour les types d'objets, Kotlin utilise le null
valeur de marque lateinit
propriété n'a pas été initialisé et à jeter l'exception appropriée lorsque la propriété est accessible.
pour les types primitifs, il n'y a pas de telle valeur, donc il n'y a aucun moyen de marquer une propriété comme non initialisée et de fournir le diagnostic que lateinit
doit fournir. (Nous pourrions essayer d'utiliser un marqueur séparé d'une certaine manière, mais ce marqueur ne serait pas mis à jour lors de l'initialisation du champ par réflexion, qui est un cas d'utilisation majeure de lateinit
).
par conséquent,lateinit
est supporté uniquement pour les propriétés des types d'objets.
une réponse courte est qu'avec primitives vous pouvez toujours utiliser 0
par défaut, et avec des types nullables null
en tant que par défaut. Seuls les types Non-primitifs Non-nullables peuvent avoir besoin de lateinit
pour contourner le système de sécurité de type.
en fait, il n'est pas nécessaire d'initialiser une variable dans Kotlin tant qu'elle a une valeur avant le premier accès, et il peut être statique prouvé. Ce qui signifie que ce code est parfaitement valide:
fun main(args: Array<String>) {
var x: Int
val y: Double
x = 0
y = x + 0.1
println("$x, $y")
}
mais il y a des cas (rares) où l'initialisation ne peut pas être prouvée statiquement. Le cas le plus courant est un champ de classe qui utilise n'importe quelle forme d'injection de dépendances:
class Window {
@Inject lateinit parent: Parent
}