Come è uno StringBuffer passaggio di dati attraverso i vuoti senza campi nella classe?

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

  •  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.

È stato utile?

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 StringBuffers sono mutevoli e hanno stato interno ad essi associati. Alcuni tipi di oggetti (come Strings) 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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top