Ciò dipenderebbe dallo scopo del codice all'interno del blocco finally. L'esempio canonico sta chiudendo un flusso dopo aver letto / scritto da esso, una sorta di "pulizia" che deve essere sempre fatta. Ripristino di un oggetto (in questo caso un iteratore) in uno stato valido IMHO conta anche come pulizia, quindi non vedo alcun problema qui. Se OTOH stavi usando return
non appena il tuo valore di ritorno è stato trovato, e aggiungendo un sacco di codice non correlato nel blocco finally, allora oscurerebbe lo scopo e renderà tutto meno comprensibile.
Non vedo alcun problema nell'usarlo quando "non ci sono eccezioni coinvolte". È molto comune utilizzare try...finally
senza catch
quando il codice può solo generare RuntimeException
e non hai intenzione di gestirli. A volte, alla fine è solo una salvaguardia, e sai per la logica del tuo programma che nessuna eccezione sarà mai lanciata (la classica condizione "questo non dovrebbe mai accadere").
Insidie: qualsiasi eccezione generata all'interno del blocco try
renderà il finally
bock eseguito. Questo può metterti in uno stato incoerente. Quindi, se la tua dichiarazione di ritorno fosse qualcosa del tipo:
return preProcess(next);
e questo codice ha generato un'eccezione, fetchNext
verrebbe comunque eseguito. OTOH se lo hai codificato come:
T ret = preProcess(next);
next = fetcher.fetchNext(next);
return ret;
quindi non funzionerebbe. So che stai ipotizzando che il codice di prova possa mai aumentare qualsiasi eccezione, ma per casi più complessi di questo come puoi essere sicuro? Se il tuo iteratore fosse un oggetto di lunga durata, ciò continuerebbe a esistere anche se un errore irreversibile si verificasse nel thread corrente, piuttosto che sarebbe importante mantenerlo in uno stato valido in ogni momento. Altrimenti, non importa molto ...
Prestazioni: sarebbe interessante decompilare tale codice per vedere come funziona sotto il cofano, ma non conosco abbastanza la JVM per fare una buona ipotesi ... Le eccezioni sono solitamente "eccezionali", quindi il codice che li gestisce non ha bisogno di essere ottimizzato per la velocità (da qui il consiglio di non usare mai eccezioni nel normale flusso di controllo dei tuoi programmi), ma non so circa finally
.