Comme je le sais, Java est de type pass-by-value à partir de ce poste . Je suis issu de Java et je me demande ce que Kotlin utilise pour passer des valeurs entre les deux. Comme dans Extensions o Méthodes etc.
Réponses
Trop de publicités?Chaque fois que j'entends parler du débat Java "pass-by-value" contre "pass-by-reference", je pense toujours la même chose. La réponse que je donne : "Java passe une copie (pass-by-value) de la référence (pass-by-reference)". Donc tout le monde est content. Je dirais que Kotlin fait la même chose car il est basé sur la JVM.
La sémantique est identique à celle de Java.
En Java, lorsque vous avez une instance d'un objet et que vous la passez à une méthode, cette méthode peut modifier l'état de cet objet et, lorsque la méthode est terminée, les modifications ont été appliquées à l'objet à l'endroit de l'appel.
Il en va de même en Kotlin.
Il utilise les mêmes principes que Java. C'est toujours du pass-by-value, vous pouvez imaginer qu'une copie est passée. Pour types primitifs par exemple Int
cela est évident, la valeur d'un tel argument sera passée dans une fonction et la variable extérieure ne sera pas modifiée. Veuillez noter que les paramètres en Kotlin ne peuvent pas être réassignés puisqu'ils agissent comme des val
s :
fun takeInt(a: Int) {
a = 5
}
Ce code ne compilera pas car a
ne peuvent pas être réaffectés.
Pour les objets, c'est un peu plus difficile mais c'est aussi du call-by-value. Si vous appelez une fonction avec un objet, une copie de sa référence est passée dans cette fonction :
data class SomeObj(var x: Int = 0)
fun takeObject(o: SomeObj) {
o.x = 1
}
fun main(args: Array<String>) {
val obj = SomeObj()
takeObject(obj)
println("obj after call: $obj") // SomeObj(x=1)
}
Vous pouvez utiliser une référence passée dans une fonction pour modifier l'objet réel. Cela aura une influence sur l'argument que vous avez transmis. Mais la référence elle-même, c'est-à-dire la valeur de la variable, ne sera jamais modifiée par un appel de fonction.
En Java les types primitifs comme int, float, double, boolean sont passés à une méthode par valeur, si vous les modifiez dans la méthode réceptrice ils ne changent pas dans la méthode appelante. Mais si le type de propriété/variable n'est pas une primitive, comme les tableaux de primitives ou d'autres classes, lorsqu'ils sont modifiés à l'intérieur de la méthode qui les reçoit en paramètre, ils sont également modifiés dans la méthode appelante. Mais avec Kotlin rien ne semble être primitif, donc je pense que tout est passé par référence.