Comment un passage de données StringBuffer par des vides sans champs dans la classe?

StackOverflow https://stackoverflow.com/questions/539758

  •  22-08-2019
  •  | 
  •  

Question

Étant donné: classe n'a pas de champ, chaque variable est locale. littleString a été créé par refactoring bigString dans Eclipse:

public String bigString()
    {
        StringBuffer bob = new StringBuffer();
        this.littleString(bob);
        return bob.toString();
    }

private void littleString(final StringBuffer bob)
    {
        bob.append("Hello, I'm Bob");
    }

La méthode littleString ne doit pas être passer le StringBuffer en arrière, mais encore est-est. Quel genre de magie noire se passe ici? Ce enfreint toutes les règles d'encapsulation que je connais. Je suis en état de choc, les mots me manquent.

Était-ce utile?

La solution

littleString ne passe pas l'objet en arrière - il est juste en utilisant le même objet. Tant la bob variable locale dans bigString() et le paramètre bob dans littleString() se réfèrent au même objet, donc si vous changez un de ces objets, les changements apparaîtront instantanément dans l'autre parce qu'ils sont tous les deux références au même objet .

Le problème est que StringBuffers sont mutable et ont l'état interne qui leur sont associés. Certains types d'objets (tels que Strings) sont immuables, de sorte que vous pouvez les passer en toute sécurité autour des paramètres de méthode, et vous savez qu'ils ne récupérons jamais modifiés. Notez que l'ajout du mot-clé final ne permet pas ici -. Juste fait en sorte que bob ne se voit assigner pour faire référence à un objet différent StringBuffer

Autres conseils

Cela ne passe rien en retour. Il est la modification de la StringBuffer vous avez passé une référence à. Les objets Java ne sont pas passés par valeur.

Si vous vouliez dire pourquoi le tampon de chaîne sont modifiés, il est parce que vous passez une référence à la mémoire tampon de chaîne, ce qui vous permet d'appeler la méthode append publique qui modifie l'objet tampon de chaîne.

les réponses ci-dessus ont à peu près, sauf un peu hasnt chose été mentionné: java manque « const-ness », ce qui signifie que vous voulez qu'un objet soit non modifiable.

« finale » est proche, mais il ne marche pas toujours faire le travail correctement. Ce que l'extrait de code est montré le genre d'erreur qui peut se produire si vous avez des objets mutables passés en tant que paramètres à d'autres méthodes. Cela peut être fixé soit en ayant des objets immuables, ou s'il y a une sorte de nouveau mot-clé ajouté pour const-ness profonde.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top