Attualmente sto lavorando sull'ottimizzazione del codice dove sto usando try.. finally per deferenza dei miei oggetti.Come provare ... finalmente funziona internamente
Ma ho la confusione che il modo in cui viene restituito un oggetto viene gestito quando sto creando un riferimento null a un oggetto nel mio blocco finally. ??
Durante la restituzione di un oggetto in un blocco try, verrà creata un'istruzione precompilata durante la compilazione? o creare un nuovo riferimento in heap mentre si tratta dell'istruzione return? o semplicemente restituire un riferimento corrente di un oggetto?
Di seguito è riportato il mio codice di ricerca.
public class testingFinally{
public static String getMessage(){
String str = "";
try{
str = "Hello world";
System.out.println("Inside Try Block");
System.out.println("Hash code of str : "+str.hashCode());
return str;
}
finally {
System.out.println("in finally block before");
str = null;
System.out.println("in finally block after");
}
}
public static void main(String a[]){
String message = getMessage();
System.out.println("Message : "+message);
System.out.println("Hash code of message : "+message.hashCode());
}
}
uscita è:
All'interno Prova Blocca
codice hash di str: -832.992.604
nel infine bolck prima
nel blocco finally dopo
Messaggio: Ciao mondo
codice Hash del messaggio: -832992604
Sono molto sorpreso quando vedo che sia l'oggetto che restituisce che l'oggetto chiamante hanno lo stesso codice hash. Quindi sono confuso riguardo al riferimento all'oggetto.
Per favore aiutami a chiarire questo fondamentale.
hashcode viene creato in base al contenuto e non all'indirizzo di riferimento o qualcosa del genere. Quindi qual è la confusione? – SMA
Grazie per la pronta risposta. la mia confusione è che sto rendendo il mio oggetto nullo nel mio blocco finale. quindi dove si trova l'oggetto di ritorno e come ?? – Pratik
[JLS-14.20.2. L'esecuzione di 'try-finally' e' try-catch-finally'] (https://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.20.2) potrebbe aiuta a chiarire la tua confusione su "finalmente". È importante notare che Java 'String' è immutabile. Quindi hai già restituito una copia di quel valore, in definitiva non puoi modificare l'istanza restituita. Se hai restituito un 'StringBuilder' e hai chiamato' setLength (0) 'alla fine, avresti ottenuto una lunghezza' StringBuilder' nel tuo chiamante. –