2010-12-06 4 views
0

Est-il possible de passer des objets mutables par valeur à une fonction dans java? Ce que je veux réellement, c'est passer un objet à une méthode, y faire des opérations (le changer) et encore appeler cette méthode avec cet ancien objet seulement (pas la valeur changée).Comment passer des objets mutables par valeur à java

voici quelques échantillons:

{ MyObj obj = new MyObj(); obj.setName("name"); 

    append(obj); 
    System.out.println(obj.name); 

    prepend(obj); 
    System.out.println(obj.name); 

    } 

    void append(MyObj obj){ obj.name+="1"; } 

    void prepend(MyObj obj){ String a = "1"; obj.name=a+obj.name; } 

A la fin de ce code, je veux que la sortie:

name1 
1name 
+0

Vous n'obtiendrez cette sortie que si l'objet * est * muté, n'est-ce pas? Comment vous attendez-vous à savoir que vous voulez ignorer le "1" * ajouté seulement après le premier appel à 'println' *? –

+0

c'est ce que je veux savoir. Comment puis je faire ça? – Anand

Répondre

4

objets eux-mêmes ne sont pas du tout passé en Java. Déjà.

Mais tout est passé par valeur - où les seules choses qui peuvent être transmises sont des valeurs primitives et des références. Ce n'est pas très clair ce que vous essayez de faire - est l'idée que vous aimeriez avoir une méthode avec (par exemple) un paramètre StringBuilder, mais sans que des modifications soient apportées à l'objet à partir de la méthode visible à l'appelant? Si c'est le cas, vous devez essentiellement cloner l'objet vous-même.

+0

Absolument correct, mais je ne l'ai pas souligné moi-même parce que je pensais que le PO ne le trouverait pas utile. :) Ce qui est en fait plutôt différent de moi. ;) –

+1

@Karl: Comprendre le modèle d'objet (et que si vous avez une variable de type référence, la valeur de cette variable est une référence, pas un objet) est absolument essentiel pour se déplacer en Java, IMO. Je suis très difficile sur ce sujet :) –

+0

Jon Skeet n'a pas encore de vote? Bizarre! :) (2 minutes plus tard ...) peu importe ... il en a un! :) –

1

Pourquoi avez-vous besoin de faire cela? Si vous ne changez pas l'objet, cela n'a pas d'importance. Si vous changez l'objet et que vous ne souhaitez pas affecter l'objet de l'appelant, alors faites en créant une copie locale. Mais je suppose qu'au moins 90% du temps les gens pensent qu'ils ont besoin de faire cela, ils ne le font pas vraiment.

Montrez du code. Que faites-vous vraiment en essayant de faire?

+0

oui, je veux changer l'objet à l'intérieur de la méthode et ne veux pas que le changement soit reflété à l'extérieur. Comment faites-vous une copie? Même cette copie sera une copie de référence de l'objet? – Anand

+0

Une copie, dans le sens "d'un objet complètement nouveau qui représente la même valeur que l'original". La façon dont vous le faites dépend de la définition de votre classe. C'est quelque chose que vous devez penser et mettre en œuvre (ce n'est pas difficile). Une fois que vous avez une implémentation, vous pouvez la transformer en une fonction membre appelée 'clone()', et prétendre implémenter l'interface 'Clonable'. –

+0

'Cloneable' ne peut pas être implémenté pour tous les objets car il est défini comme protégé dans la classe' Object'. nous devons le surcharger dans notre classe et si la classe est une classe de bibliothèque java, cela devient également impossible. – Anand

2

Malheureusement, non. Java jamais passe Objets par valeur, il passe la référence de l'objet par valeur.

Explication de here:

Qu'est-ce qui se passe réellement est que objets sont toujours détenus par référence en java - jamais en valeur - et les références sont, en effet, être transmis par valeur.

+3

Java ne passe jamais les objets, point final. Il passe des références, par valeur. Ne contredisez pas votre propre citation. ;) Cela fait une différence; si les objets étaient réellement passés par référence, vous pourriez implémenter l'équivalent de 'std :: swap' en C++. –

+0

@Karl Knechtel, oui, je me suis contredit ... J'ai mis à jour. –

+0

Malheureusement ?? –

-2

AFAIK immutable/mutable n'est pas associé au fait de passer en valeur/référence. Les chaînes sont transmises par référence, pas par valeur. Ce qui rend la chaîne immuable est la conception de la classe de chaînes elle-même. Peut-être pourriez-vous expliquer un peu plus ce que vous cherchez.

+0

Voir les autres commentaires sur la distinction entre la transmission d'une valeur par référence et la transmission d'une référence par valeur. –

+0

YEah Il me manque une copie de mot - copie de référence. Ce qui rend cette question importante pour moi est la question de l'immunité. – Peposh

+0

C'est immuable, pas immunisable. –

Questions connexes