Un approccio a Java: switch statement

by Alessio Mungelli Date: 29-12-2020 java jdk jre programmazione codice sorgente switch statement case esempio tutorial

Ciao a tutti e bentornati!

Dopo una pausa, torniamo oggi con un'altra parte del corso introduttivo alla programmazione, parlando di switch statement, conosciuto anche come costrutto di selezione multipla. 

Intuizione

L'idea dello switch statement nasce da un problema che vediamo adesso.

Il problema è quello di cercare un modo comodo per evitare lunghe catene di if-elseif-else. Cerchiamo di rendere un po' più concreta questa situazione. Ipotizziamo di voler realizzare un menù ad interfaccia testuale con una ventina di opzioni, che dovrà richiedere all'utente di effettuare una scelta ed eseguire le operazioni corrispondenti alla scelta effettuata. Ci si trova quindi a vedere su schermo una cosa simile alla seguente:

1. Scelta 1

2. Scelta 2

...

Il modo più immediato di gestire questa situazione, potrebbe essere, per l'appunto, una lunga serie di if-elseif-else, scrivendo una porzione di codice simile alla seguente:

if(scelta == 1){
//fai qualcosa
}else if(scelta == 2){
//fai qualcos'altro
}
...
else{
//fai qualcos'altro ancora
}

Il problema di questo primo approccio si rende ben visibile quando le possibili scelte sono davvero molte. Il codice diventa molto lungo, e soprattutto di difficile lettura. Questo, alla lunga, può diventare un problema, soprattutto se non siamo le uniche persone a doverci occupare del prodotto su cui stiamo lavorando. 

È evidente il fatto che, con gli strumenti attuali, non siamo in grado di scrivere del codice migliore rispetto a quello presentato prima. Diventa quindi necessario introdurre un nuovo strumento: lo switch

Lo switch case

Come per tutti gli altri strumenti che ho introdotto in precedenza, andiamo prima di tutto a vedere com'è composto a livello sintattico.

Sintassi

Vediamo a livello sintattico com'è composto questo costrutto.

variabileCheRappresentaLaScelta
switch(variabileCheRappresentaLaScelta){
case valoreUno:
    break;
    case valoreDue:
    break;
    ....
    default:
}

Tipo del parametro

Prima di effettuare una disamina relativa al funzionamento dello  switch-case , è d'obbligo sottolineare che il parametro dello switch deve essere una espressione (o variabile) di tipo  byte short char int  oppure  Enum  (vedremo più avanti di cosa si tratta). Dalla versione 7 di Java, viene contemplato anche il tipo String. 

Questo significa che i valori nelle clausole case (valoreUno, valoreDue, ...) devono essere del medesimo tipo del parametro (variabileCheRappresentaLaScelta).

Interpretazione semantica

L'interpretazione dello switch case è leggermente più complicata rispetto a quella dell'if-elseif-else. Come suggeriscono gli amici di html.it, può essere comodo leggere il codice come segue:

“dato un valore per variabileCheRappresentaLaScelta, procedi ad eseguire le istruzioni a partire dal  case  contrassegnato dallo stesso valore”.

La parte critica di questa interpretazione è proprio quella dell'a partira da. Significa proprio che viene effettuato un salto al case del valore corrispondente, ignorando completamente tutti gli altri case.  

Vi è inoltre il caso di default case, che viene eseguito se e solo se nessuno dei case precedenti è soddisfatto. Questo case è assolutamente opzionale. Se lo omettiamo, dobbiamo essere coscienti del fatto che nessun'operazione verrà eseguita se nessuno dei case è soddisfatto. Generalmente, questo è un male perchè è bene che venga restituito all'utente un messaggio di errore in questo caso. 

L'istruzione break

Iniziamo con una premessa. Questo è l'unico caso contemplato dalla programmazione strutturata dove è concesso utilizzare l'istruzione break

Tecnicamente, il break non fa parte del costrutto in sè, ma viene usato in connessione ad esso ed è opzionale.

L'istruzione  break  è un'istruzione del linguaggio e serve a terminare l'esecuzione di un blocco di programma. Volendo essere più precisi, serve a terminare un blocco associato ad un ciclo o ad uno switch. 

La domanda che ci si può porre è: "cosa succede se ometto il break?". 

Succede che i case vengono eseguiti in sequenza fino a quando non si trova un break o fino a quando non si giunge al termine dello switch. 

Esempio

Il primo, semplice esempio che vediamo è quello dove vogliamo restituire all'utente la trascrizione in lettere di un numero inserito. Chiaramente, dovendo scrivere un numero finito di case dovremo stabilire un range e di conseguenza definire il case dove restituiremo un qualche messaggio di errore nel caso in cui il numero inserito dall'utente non sia nel range.

Vedremo in seguito le istruzioni per richiedere un input all'utente, per cui simuleremo l'input dell'utente assegnando nel codice un valore ad una variabile. 

Analizziamo subito il codice.

public class Main{
    public static void main(String[] args){
        int numero = n;
        switch(numero){
        case 1:
            System.out.println("Uno");
            break;
        case 2:
            System.out.println("Due");
            break;
        case 3:
            System.out.println("Tre");
            break;
        default:
            System.out.println("Out of range");
        }
    }
}

Vediamo bene che l'esempio ricalca a pieno la sintassi che ho fornito prima. Se la variabile numero vale 1, allora stamperà a schermo la stringa "Uno" e via dicendo. È assolutamente necessario inserire l'istruzione di break dal momento in cui, se la omettessimo, verrebbero eseguiti tutti i case in sequenza fino al primo break se presente o fino al termine dello switch in alternativa. 

Bisogna fare attenzione che questo sorgente, così com'è, non è funzionante. Alla terza riga, dove vediamo scritto  int numero = n;  dobbiamo rimuovere la n a destra dell'uguale e sostituire il valore vero e proprio. Questo è un modo un po' "rozzo" di simulare un input dell'utente, ma è più che sufficiente in questi casi, dove il focus deve essere l'apprendimento e non l'usabilità dell'applicazione.  

Altro esempio

In questo altro esempio, vogliamo determinare se un determinato carattere è una vocale o una consonante. Vediamo come è possibile farlo. Prima di analizzare il codice, è bene precisare che userò una nuova feature introdotta con Java 12, ovvero la possibilità di contemplare più valori in uno stesso case.

Vediamo il frammento di codice dello switch.

public class Main{
    public static void main(String[] args){
        int numero = n;
        switch(numero){
        case 'a', 'e', 'i', 'o', 'u':
            System.out.println("Vocale");
            break;
        default:
            System.out.println("Consonante");
        }
    }
}

Vediamo come siano presenti due case, uno per le vocali e uno per le consonanti. L'intuizione è che se non eseguo il case relativo alle vocali, posso eseguire le istruzioni del default case per comunicare che il carattere è una consonante. 

Anche per questa volta è tutto. Come sempre, vi invito a sperimentare wink

 
by Alessio Mungelli Date: 29-12-2020 java jdk jre programmazione codice sorgente switch statement case esempio tutorial visite : 2972  
 
Alessio Mungelli

Alessio Mungelli

Computer Science student at UniTo (University of Turin), Network specializtion, blogger and writer. I am a kind of expert in Java desktop developement with interests in AI and web developement. Unix lover (but not Windows hater). I am interested in Linux scripting. I am very inquisitive and I love learning new stuffs.

 
 
 

Articoli correlati

Un approccio a Java: Il ciclo while

Ciao a tutti e bentornati! Dopo aver fatto una breve, ma corposa, introduzione sui cicli, andiamo oggi a vedere finalmente le prime implementazioni che utilizzano quello che abbiamo definito ciclo precondizionale. In Java, come…

Un approccio a Java: I cicli - Introduzione

Ciao a tutti e bentornati! Sino ad ora, abbiamo parlato di variabili e di strutture di selezione, andando a considerare alcuni degli aspetti fondamentali di questi due concetti. Teoricamente, per…

Un approccio a Java: strutture di selezione - casi d'uso

Ciao a tutti e bentornati! Sino ad ora ci siamo preoccupati di fare una carrellata quanto più completa riguardo i concetti fondamentali di cui abbiamo bisogno per approcciarci all'utilizzo delle…

Un approccio a Java: operatori booleani

La volta precedente, abbiamo ampiamente parlato delle variabili booleane, cercando di delineare quali siano le principali operazioni che si possono effettuare proprio a livello pratico.  Di tutti i casi esaminati, non abbiamo…

Un approccio a Java: le variabili booleane

Ciao a tutti e bentornati! La volta precedente, ho fatto un'introduzione alle strutture condizionali, definendo il loro funzionamento. Prima di poter dare qualche esempio pratico, è necessario chiarire in che modo ci…

Un approccio a Java: strutture condizionali

Ciao a tutti e bentornati! Le volte precedenti abbiamo introdotto il concetto di variabile, tentando di definire alcuni concetti basilari a riguardo.  Alcune situazioni fanno però intuire come il solo concetto…

Un approccio a Java: Le variabili - caso d'uso

Ciao a tutti amici e bentornati! Dopo l'introduzione fatta sulle variabili, cerchiamo di analizzare alcune criticità che si possono presentare in situazioni alquanto comuni. Partiamo quindi analizzando degli esempi pratici.  Esempio 1: divisione…

Un approccio a Java: Le variabili

Ciao a tutti e bentornati! Quest'oggi inizieremo un percorso che ci porterà a studiare, ed eventualmente ripassare, quelle che sono le basi della programmazione. Inizieremo parlando di variaibli. Introduzione Chiunque voglia approcciarsi al…

Hashmap con concatenamento: liste di trabocco

In questa breve serie di articoli andremo a vedere com'è possibile realizzare in C la struttura dati Hashmap. Nell'implementazione andremo ad usare le liste doppiamente concatenate come strutture dati ausiliarie. Andiamo…

Java Strutture Dati: Liste Concatenate

Con il 2020 andiamo ad esaminare un nuovo aspetto della programmazione: le strutture dati. Spesso capita a tutti di utilizzare strutture messe a disposizione dai vari linguaggi di programmazione. L'obiettivo sarà…

Java Algoritmi di Ordinamento: Selection Sort

Andiamo oggi ad analizzare in dettaglio un algoritmo di ordinamento non molto efficiente ma piuttosto utilizzato in diversi ambiti. Stiamo parlando del Selection Sort. Vediamo meglio in dettaglio. Intuizione L'idea alla base è quella…

Java algoritmi di ordinamento: Merge Sort

Andiamo oggi ad analizzare uno tra i migliori algoritmi di ordinamento: il Merge Sort. Detto anche algoritmo per fusione, fa parte della famiglia dei Divide and Conquer proprio come il Quick Sort. A differenza del…

Clicky