CodeGym /Java Blog /Random-IT /Dichiarazione switch Java
John Squirrels
Livello 41
San Francisco

Dichiarazione switch Java

Pubblicato nel gruppo Random-IT

Un po' di teoria su Java Switch

Immagina di essere un cavaliere fermo a un bivio. Se vai a sinistra, perderai il tuo cavallo. Se vai a destra, acquisirai conoscenza. Come rappresenteremmo questa situazione in codice? Probabilmente sai già che usiamo costrutti come if-then e if-then-else per prendere queste decisioni.

if (turn_left) { 
    System.out.println("You will lose your horse"); 
}
if (turn_right) {
    System.out.println("You will gain knowledge");
}
else 
    System.out.println("So you're just going to stand there?");

Ma cosa succede se la strada non si divide in due, ma in dieci? Hai strade che sono "completamente a destra", "leggermente a sinistra di quella", "un po' più a sinistra" e così via, per un totale di 10 possibili strade? Immagina come crescerà il tuo codice "if-then-else " in questa versione!

if (option1)
{…}
else if (option2)
{…}
…
else if (optionN) ...
Supponiamo di avere un bivio a 10 vie (è importante qui che il numero di opzioni sia finito). Per tali situazioni, Java ha l' istruzione switch .

       switch (ExpressionForMakingAChoice) {
           case (Value1):
               Code1;
               break;
           case (Value2):
               Code2;
               break;
...
           case (ValueN):
               CodeN;
               break;
           default:
               CodeForDefaultChoice;
               break;
       }

Ecco come funziona la dichiarazione:
  • ExpressionForMakingACoice viene valutato. Quindi l'istruzione switch confronta il valore risultante con il successivo ValueX (nell'ordine in cui sono elencati).
  • Se ExpressionForMakingAChoice corrisponde a ValueX, viene eseguito il codice che segue i due punti.
  • Se viene rilevata un'istruzione break , il controllo viene trasferito all'esterno dell'istruzione switch.
  • Se ExpressionForMakingAChoice non corrisponde ad alcun ValueX, il controllo passa a CodeForDefaultCase.
Punti importanti
  • Nell'istruzione switch, il tipo di ExpressionForMakingAChoice deve essere uno dei seguenti:

    • byte , short , char , int .
    • Byte , Short , Character , Integer (wrapper dei tipi di dati primitivi).
    • Stringa .
    • Enum .
  • Il blocco predefinito è facoltativo. Se è assente e ExpressionForMakingAChoice non corrisponde ad alcun ValueX, non verrà eseguita alcuna azione.
  • L' istruzione break non è richiesta. Se è assente, il codice continuerà ad essere eseguito (ignorando ulteriori confronti nelle istruzioni case) fino alla prima occorrenza di break o fino alla fine dell'istruzione switch .
  • Se lo stesso codice deve essere eseguito per più scelte, possiamo eliminare la duplicazione specificando diverse istruzioni case consecutive.

Diamo ora un'occhiata a come viene utilizzata l'istruzione switch in Java

Non ti preoccupare: abbiamo finito con la teoria. Dopo aver visto i seguenti esempi, tutto diventerà molto più chiaro. Bene, cominciamo. Diamo un'occhiata a un esempio dall'astronomia che coinvolge i pianeti del nostro sistema solare. In accordo con gli ultimi atteggiamenti internazionali, abbiamo escluso Plutone (a causa delle proprietà della sua orbita). Ricordiamo che i nostri pianeti sono disposti in base alla loro distanza dal Sole come segue: Mercurio, Venere, Terra, Marte, Giove, Saturno, Urano e Nettuno. Scriviamo un metodo Java che prenda il numero ordinale di un pianeta (relativo alla sua distanza dal Sole) e restituisca i componenti principali dell'atmosfera del pianeta come List <String>. Ricorderai che alcuni pianeti hanno una composizione atmosferica simile. Pertanto, Venere e Marte contengono principalmente anidride carbonica; l'atmosfera di Giove e Saturno è costituita da idrogeno ed elio; e Urano e Nettuno aggiungono metano all'ultima coppia di gas. Ecco la nostra funzione:

public static List<String> getPlanetAtmosphere(int seqNumberFromSun) {
    List<String> result = new ArrayList<>();
    switch (seqNumberFromSun) {
        case 1: result.add("No atmosphere");
            break;
        case 2:
        case 4: result.add("Carbon dioxide");
            break;
        case 3: result.add("Carbon dioxide");
            result.add("Nitrogen");
            result.add ("Oxygen");
            break;
        case 5:
        case 6: result.add("Hydrogen");
            result.add("Helium");
            break;
        case 7:
        case 8: result.add("Methane");
            result.add("Hydrogen");
            result.add("Helium");
            break;
        default:
            break;
    }
    return result;
}
Nota che stiamo usando lo stesso codice per pianeti con composizioni atmosferiche identiche. Lo abbiamo fatto utilizzando case statement consecutivi. Se vogliamo ottenere la composizione dell'atmosfera del nostro pianeta natale, chiamiamo il nostro metodo con 3 come argomento:

getPlanetAtmosphere(3).
System.out.println(getPlanetAtmosphere(3)) returns ["Carbon dioxide", "Nitrogen", "Oxygen"].
Esperimento con break: cosa succede se rimuoviamo tutte le istruzioni break ? Proviamolo:

    public static List<String> getPlanetAtmosphere(int seqNumberFromSun) {
        List<String> result = new ArrayList<>();
        switch (seqNumberFromSun) {
            case 1: result.add("No atmosphere");
            case 2:
            case 4: result.add("Carbon dioxide");
            case 3: result.add("Carbon dioxide");
                result.add("Nitrogen");
                result.add ("Oxygen");
            case 5:
            case 6: result.add("Hydrogen");
                result.add("Helium");
            case 7:
            case 8: result.add("Methane");
                result.add("Hydrogen");
                result.add("Helium");
            default:
        }
        return result;
    }
Se stampiamo il risultato di System.out.println(getPlanetAtmosphere(3)) , scopriamo che il nostro pianeta natale non è così vivibile. O è? Giudica tu stesso: ["Anidride carbonica", "Azoto", "Ossigeno", "Idrogeno", "Elio", "Metano", "Idrogeno", "Elio"] . Perché è successo? Il programma esegue tutte le istruzioni case dopo la prima corrispondenza fino alla fine del blocco switch .

Ottimizzazione eccessiva delle istruzioni break

Si noti che è possibile migliorare il metodo disponendo diversamente le istruzioni ei casi break .

public static List<String> getPlanetAtmosphere(int seqNumberFromSun) {
    List<String> result = new ArrayList<>();
    switch (seqNumberFromSun) {
        case 1: result.add("No atmosphere");
                break;
        case 3: result.add("Nitrogen");
                result.add ("Oxygen");
        case 2:
        case 4: result.add("Carbon dioxide");
                break;
        case 7:
        case 8: result.add("Methane");
        case 5:
        case 6: result.add("Hydrogen");
                result.add("Helium");
    }
     return result;
}
Sembra meno codice, giusto? Abbiamo ridotto il numero totale di dichiarazioni giocando con l'ordine delle dichiarazioni del caso e raggruppandole. Ora ogni tipo di gas viene aggiunto all'elenco in una sola riga di codice. Il codice fornito nell'ultimo esempio è solo per mostrare come funzionano le cose. Non è consigliabile scrivere codice in questo modo. Se l'autore di tale codice Java (per non parlare di altri programmatori) deve mantenerlo, troverà molto difficile ricostruire la logica dietro la formazione di quei blocchi case e il codice eseguito nell'istruzione switch .

Differenze da se

Date le somiglianze esteriori delle istruzioni if ​​e switch , non dimenticare che l' istruzione switch seleziona uno dei casi in base a un VALORE SPECIFICO, mentre l'istruzione if può avere qualsiasi espressione booleana. Tienilo a mente quando progetti il ​​tuo codice.

Conclusione

  • Usa l' istruzione case per più di due rami per non ingombrare il tuo codice con istruzioni if.
  • Non dimenticare di completare il blocco logico del ramo per ogni valore specifico (istruzione case) inserendo un'istruzione break .
  • L' espressione dell'istruzione switch può essere un Enum o String , nonché alcuni tipi primitivi.
  • Ricorda il blocco predefinito . Usalo per gestire valori imprevisti.
  • Per ottimizzare le prestazioni, sposta i rami di codice corrispondenti ai valori più comuni all'inizio del blocco switch .
  • Non lasciarti trasportare dalla tua "ottimizzazione" eliminando le istruzioni break alla fine delle istruzioni case : tale codice è difficile da capire e, di conseguenza, difficile da mantenere.
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION