23 votes

Kotlin est-il "pass-by-value" ou "pass-by-reference" ?

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.

23voto

Pelocho Points 4397

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.

15voto

hasenj Points 36139

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.

4voto

s1m0nw1 Points 21698

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.

3voto

user2604769 Points 31

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X