CONTROLLO DI FLUSSO
INTRODUZIONE
Sulla base di quello che abbiamo imparato sinora, sappiamo che l’esecuzione di un programma Java avviene in maniera sequenziale. In un qualunque software che andremo a scrive c’è bisogno di alterare il normale flusso del programma in base a una serie di condizioni che si vengono a verificare. A tal proposito Java come tutti gli altri linguaggi di programmazione ci mette a disposizione alcune istruzioni per il controllo del flusso. Un programma possiede sempre un proprio percorso di esecuzione come vediamo in figura.
Questo è il caso più semplice, il programma esegue le istruzioni una dopo l’altra in sequenza dall’alto verso il basso passando eventualmente da un metodo ad un altro; tuttavia, nella maggior parte dei casi è necessario alterare questo flusso durante l’esecuzione del programma in base a condizioni che si vengono a verificare.
Noi sappiamo anche cha Java possiede dei blocchi di codice, cioè istruzioni delimitate da una coppia di parentesi graffe.
MODIFICARE IL NORMALE FLUSSO DI ESECUZIONE
Le istruzioni racchiuse tra parentesi graffe fanno parte di un unico blocco di codice la cui esistenza la abbiamo finora tralasciata. È proprio a questo punto che entra in scena il controllo di flusso o control flow che ci permette di uscire dalla logica semplice del flusso prefissato per aggiungere un livello anche molto elevato di flessibilità permettendoci di scrivere programmi anche molto complessi dal punto di vista della logica applicativa.
ALTERAZIONE DEL CONTROLLO DI FLUSSO, CATEGORIE
Il controllo di flusso può essere alterato attraverso tre categorie di istruzioni. La prima è il Branching Condizionale che consente al codice di prendere diversi rami in base a delle condizioni che si verificano. La seconda categoria è il Looping Iterativo, cioè eseguire iterativamente un blocco di codice fino a che una certa condizione è verificata. Si utilizza un test condizionale per provocare l’esecuzione di un insieme di istruzioni (blocco di codice) fintantoché l’esito di questo test rimane vero. La terza categoria è il Jumping o salto incondizionato che ci permette di interrompere immediatamente il flusso del programma per saltare letteralmente a eseguire del codice che si trova in un’altra parte di programma.
LO STATEMENT IF/ELSE
Questa è la prima serie di istruzioni dedicate al Branching, vedremo come prendere delle decisioni all’interno di un programma in base a condizioni booleane. Dichiariamo una variabile intera temperatura e assegniamo ad essa il valore 20.
Il primo test booleano verifica se la temperatura è maggiore di 25 gradi se lo è viene eseguito il codice del blocco if altrimenti else, la condizione non è verificata e viene eseguito il codice del ramo else. Possiamo anche introdurre più clausole else if che di fatto completano lo Statement if/else.
Una sola di queste clausole verrà scelta sulla base della condizione booleana contenuta al proprio interno. Si possono usare un qualsiasi numeri di blocchi else if. Se nessuno dei blocchi if, else if viene soddisfatto dalla condizione booleana, allora viene eseguito il codice associato al ramo else. Se c’è una singola istruzione in un blocco o nei blocchi come in questo caso le parentesi graffe possono essere omesse.
LO STATEMENT SWITCH
Lo statement switch è un’altra istruzione che fa parte del Branching. È anch’esso un test condizionale. Questa istruzione è molto utile quando dobbiamo prendere delle decisioni sulla base di una singola variabile.
Se il valore della variabile è uguale al valore specificato in un certo case, allora verrà eseguito il codice associato a quel case. Il break interrompe immediatamente il flusso di codice nello switch e sposta l’esecuzione alla prima istruzione che si trova dopo lo switch. break è il primo esempio dei salti incondizionati. Se omettiamo l’istruzione break il programma prosegue con l’esame del successivo case. Se nessuno dei case precedenti ha avuto esito positivo si entra nel ramo default e viene eseguito quel codice.
LISTA COSTANTI NEL CASE (JDK14)
Riprendiamo l’esempio della versione precedente e riscriviamolo come da immagine.
Abbiamo la possibilità di impilare uno sopra l’altro una serie di case differenti, dato cha la valutazione dei case si sposta dall’alto verso il basso se myVar vale 10, 20, o 30 si entra nel blocco di codice contrassegnato da “Primo stack”. Possiamo passare dal case stacking al case constant list come mostra la figura.
SWITCH EXPRESSION (JDK14)
È sicuramente l’innovazione più importante introdotta nel JDK14. Fino adesso abbiamo visto lo switch come uno statement, dalla versione 14 possiamo usare le espressioni. Uno switch expression ora è in grado di ritornare un valore. Partiamo con un esempio tradizionale e mettiamo a confronto i due tipi.
In un caso come questo è molto meglio trasformare lo statement switch in una switch expression.
Abbiamo spostato la dichiarazione della variabile stringa nome, che è la variabile assegnata dallo switch che ritorna un valore. Possiamo fare tutto ciò che si fa con le espressioni, come ad esempio ritornarlo da un metodo, passarlo a un metodo come argomento e così via. All’interno dello switch i break sono stati eliminati, yield significa restituisci, ed è una nuova parola chiave che interrompe immediatamente lo switch e produce un valore di ritorno. Tale parola chiave assegna un valore alla variabile nome. Una cosa importante da dire è che il blocco di codice deve essere chiuso con un punto e virgola. La switch espression deve essere esaustiva questo significa che i case che noi andiamo ad inserire devono coprire tutti i casi possibili, quindi utilizzare sempre un default per renderla esaustiva.
ARROW CASE (JDK14)
È una nuova forma di utilizzo dello switch sia per gli statement switch che per le expression switch. In tutti i casi abbiamo utilizzato i case che terminano con i due punti. A partire dalla versione 14 possiamo usare una freccia al posto dei due punti (Arrow case).
È scomparsa l’istruzione yield, tuttavia in presenza di una Arrow case il codice ritorna esattamente i valori come con l’istruzione yield, nel caso in figura la switch expression ritorna venti, assegnata poi alla variabile nome.
Una cosa impostante da sapere è che un Arrow case consente di inserire un blocco di codice nei case. Essendoci un blocco di codice dobbiamo rendere esplicito il ritorno dal case con l’istruzione yield che va usata solo con i blocchi di codice ossia quando abbiamo due o più istruzioni. Se il blocco case ha una singola istruzione, yield si può omettere.
Vediamo il caso di uno statement switch.
LINK AI POST PRECEDENTI
LINK AL CODICE SU GITHUB
ESECUZIONE DEL CODICE DI ESEMPIO
- Scaricare il codice da GITHUB, lanciare il file JAR con il seguente comando in Visual Studio Code, posizionandosi nella directory contenente il JAR.
java -jar –enable-preview CorsoJava.jar
- Oppure mettere in esecuzione il main che si trova nel file CorsoJava.java.
Scrivi un commento