Come è uno StringBuffer passaggio di dati attraverso i vuoti senza campi nella classe?
-
22-08-2019 - |
Domanda
Dato: Classe non ha campi, ogni variabile è locale. littleString è stato creato da refactoring BigString in 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");
}
Il metodo littleString non deve essere passando lo StringBuffer schiena, ma ancora è, è. Che tipo di magia nera che succede qui? Questo sta rompendo tutte le regole di incapsulamento che conosco. Sono in stato di shock, mi mancano le parole.
Soluzione
littleString
non passa l'oggetto di nuovo - è solo utilizzando lo stesso oggetto. Sia il bob
variabile locale nel bigString()
e il parametro bob
in littleString()
si riferiscono allo stesso oggetto, quindi se si cambia uno di quegli oggetti, appariranno i cambiamenti istantaneamente in un altro perché sono entrambi i riferimenti allo stesso oggetto .
Il problema è che StringBuffer
s sono mutevoli e hanno stato interno ad essi associati. Alcuni tipi di oggetti (come String
s) sono immutabili, in modo da poter tranquillamente passare intorno come parametri del metodo, e si sa che non sarà mai modificato. Si noti che l'aggiunta della parola chiave final
non aiuta qui -. Rende solo in modo che bob
non viene mai assegnato per fare riferimento a un oggetto diverso StringBuffer
Altri suggerimenti
Non è passare nulla in cambio. E 'la modifica del StringBuffer avete passato un riferimento a. Gli oggetti in Java non sono passati per valore.
Se si intende perché il buffer di stringa ottenere modificato, è perché si stavano passando un riferimento al buffer di stringa, che permette di chiamare il metodo pubblico di aggiunta, che modifica l'oggetto buffer di stringa.
le risposte di cui sopra praticamente ottenuto, ad eccezione stato menzionato una piccola cosa hasnt: java manca "const-ness", il che significa che si desidera un oggetto da immodificabile.
"finale" è vicino, ma ancora doesnt fare il lavoro correttamente. Quello che il frammento di codice mostrato è il tipo di errore che può accadere se si dispone di oggetti mutabili passati come parametri ad altri metodi. Questo può essere risolto né da avere oggetti immutabili, o se c'è un qualche tipo di nuova parola chiave aggiunto per una profonda const-ness.