Gli oggetti passati ad altri metodi possono essere modificati dal metodo e il chiamante noterà la modifica. Se lasci che qualcun altro usi il tuo Stream
, potrebbero chiuderlo e non te ne accorgeresti mai fino a quando non proverai a scrivere e fallire. Ecco perché di solito è una buona idea non passare oggetti mutabili fuori dal tuo controllo.
La confusione si verifica spesso perché molti libri di testo dicono categoricamente che "Java ha una semantica pass-by-value". Ciò è tecnicamente vero, ma non molto utile per uno studente di lingue. Tecnicamente , non è l'oggetto che viene passato in giro ma un riferimento a un oggetto,
e il metodo chiamato ottiene una copia del riferimento, che ovviamente fa riferimento allo stesso oggetto .
Ma in pratica, la differenza tra riferimento a oggetti e oggetti spesso non è chiara nelle menti delle persone. Nessuno è mai interessato al valore di un riferimento se non quello di verificare se è null
. Infatti, Java non ha nemmeno ha una sintassi di dereferenziamento a parte il selettore di membri .
. Ciò che interessa alla gente è lo stato dell'oggetto sottostante . Quindi efficace significa che gli oggetti mutabili sono passati per riferimento nel senso che il chiamante può cambiarli, e tu potresti esserne influenzato. In questo senso, la spiegazione del manuale è corretta e utile per i tipi primitivi, ma corretta e fuorviante per i tipi di oggetto.