CodeGym /Java blog /Véletlen /Java switch nyilatkozat
John Squirrels
Szint
San Francisco

Java switch nyilatkozat

Megjelent a csoportban

Egy kis elmélet a Java Switchről

Képzeld el, hogy egy lovag vagy, aki megállt az útelágazásnál. Ha balra mész, elveszíted a lovadat. Ha jól jársz, tudást szerzel. Hogyan ábrázolnánk ezt a helyzetet kódban? Valószínűleg már tudja, hogy az if-then és if-then-else konstrukciókat használjuk ezekhez a döntésekhez.

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?");

De mi van akkor, ha az út nem kettőre, hanem tízre szakad? Vannak útjai, amelyek "teljesen jobbra", "enyhén balra", "kicsit balra" és így tovább, összesen 10 lehetséges út? Képzelje el, hogyan fog növekedni a "ha-akkor-else " kód ebben a verzióban!

if (option1)
{…}
else if (option2)
{…}
…
else if (optionN) ...
Tegyük fel, hogy van egy 10 irányú útelágazás (itt fontos, hogy az opciók száma véges legyen). Ilyen helyzetekre a Java rendelkezik a switch utasítással.

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

Így működik az állítás:
  • Az ExpressionForMakingAChoice kiértékelésre kerül. Ezután a switch utasítás összehasonlítja a kapott értéket a következő ValueX értékkel (a felsorolás sorrendjében).
  • Ha az ExpressionForMakingAChoice egyezik a ValueX értékkel, akkor a kettőspontot követő kód végrehajtásra kerül.
  • Ha break utasítást észlel, akkor a vezérlés a switch utasításon kívülre kerül.
  • Ha az ExpressionForMakingAChoice nem egyezik egyik ValueX-szel sem, akkor a vezérlés átmegy a CodeForDefaultCase-re.
Fontos pontok
  • A switch utasításban az ExpressionForMakingAChoice típusának a következők egyikének kell lennie:

    • bájt , rövid , char , int .
    • Byte , Short , Character , Integer (a primitív adattípusok burkolói).
    • String .
    • Enum .
  • Az alapértelmezett blokk nem kötelező. Ha ez hiányzik, és az ExpressionForMakingAChoice nem egyezik egyik ValueX-szel sem, akkor semmilyen művelet nem kerül végrehajtásra.
  • A break utasítás nem kötelező. Ha hiányzik, a kód végrehajtása folytatódik (a case utasítások további összehasonlításait figyelmen kívül hagyva) a break első előfordulásáig vagy a switch utasítás végéig .
  • Ha ugyanazt a kódot több választáshoz kell végrehajtani, akkor több egymást követő eset utasítás megadásával kiküszöbölhetjük a duplikációt .

Most nézzük meg, hogyan használják a switch utasítást a Java-ban

Ne aggódjon: végeztünk az elmélettel. A következő példák megtekintése után minden sokkal világosabb lesz. Nos, kezdjük. Nézzünk egy csillagászati ​​példát naprendszerünk bolygóira. A legújabb nemzetközi hozzáállásnak megfelelően kizártuk a Plútót (pályája tulajdonságai miatt). Emlékeztetünk arra, hogy bolygóink a Naptól való távolságuk szerint a következőképpen vannak elrendezve: Merkúr, Vénusz, Föld, Mars, Jupiter, Szaturnusz, Uránusz és Neptunusz. Írjunk egy Java metódust, amely felveszi egy bolygó sorszámát (a Naptól való távolságához képest), és visszaadja a bolygó légkörének fő összetevőit List <String> formájában.. Emlékszel, hogy néhány bolygónak hasonló a légköri összetétele. Így a Vénusz és a Mars főként szén-dioxidot tartalmaz; a Jupiter és a Szaturnusz légköre hidrogénből és héliumból áll; az Uránusz és a Neptunusz pedig metánt ad az utolsó gázpárhoz. Íme a funkciónk:

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;
}
Ne feledje, hogy ugyanazt a kódot használjuk az azonos légköri összetételű bolygókhoz. Ezt egymást követő esetleírások felhasználásával tettük . Ha meg akarjuk kapni szülőbolygónk légkörének összetételét, akkor a 3-as módszerünket nevezzük:

getPlanetAtmosphere(3).
System.out.println(getPlanetAtmosphere(3)) returns ["Carbon dioxide", "Nitrogen", "Oxygen"].
Kísérlet a break-el: Mi történik, ha eltávolítjuk az összes break utasítást? Próbáljuk meg:

    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;
    }
Ha kinyomtatjuk a System.out.println(getPlanetAtmosphere(3)) eredményét , akkor azt látjuk, hogy szülőbolygónk nem annyira élhető. Vagy ez? Ítélje meg maga: ["Szén-dioxid", "Nitrogén", "Oxigén", "Hidrogén", "Hélium", "Metán", "Hidrogén", "Hélium"] . Miért történt ez? A program az összes eset utasítást végrehajtja az első egyezés után a kapcsolóblokk végéig .

A break utasítások túlzott optimalizálása

Vegyük észre, hogy a metóduson javíthatunk a break utasítások és esetek eltérő elrendezésével.

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;
}
Kevesebb kódnak tűnik, igaz? Csökkentettük a kijelentések teljes számát azáltal, hogy eljátszottuk az esetkijelentések sorrendjét, és átcsoportosítottuk őket. Mostantól minden gáztípus csak egy kódsorban kerül fel a listára. Az utolsó példában megadott kód csak a dolgok működésének bemutatására szolgál. Nem javasoljuk a kód írását így. Ha egy ilyen Java kód szerzőjének (nemhogy más programozóknak) fenn kell tartania azt, akkor nagyon nehéz lesz rekonstruálnia az esetblokkok kialakításának logikáját és a switch utasításban végrehajtott kódot .

Különbségek a ha

Tekintettel az if és switch utasítások külső hasonlóságaira , ne felejtse el, hogy a switch utasítás egy SPECIFIC ÉRTÉK alapján választja ki az esetek egyikét, míg az if utasításnak bármilyen logikai kifejezése lehet. Ezt tartsa szem előtt a kód megtervezésekor.

Következtetés

  • Használja a case utasítást kettőnél több ághoz, hogy ne zsúfolja össze a kódot if utasításokkal.
  • Ne felejtse el befejezni az ág logikai blokkját minden egyes értékhez (case utasítás) break utasítás beszúrásával .
  • A switch utasítás kifejezése lehet Enum vagy String , valamint néhány primitív típus.
  • Emlékezzen az alapértelmezett blokkra. Váratlan értékek kezelésére használja.
  • A teljesítmény optimalizálása érdekében helyezze át a leggyakoribb értékeknek megfelelő kódágakat a kapcsolóblokk elejére .
  • Ne ragadjon el az "optimalizálásban" az eset- utasítások végén található break utasítások törlésével – az ilyen kódokat nehéz megérteni, és ennek következtében nehéz karbantartani.
Hozzászólások
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION