CodeGym /Java Blog /Willekeurig /Java-switchverklaring
John Squirrels
Niveau 41
San Francisco

Java-switchverklaring

Gepubliceerd in de groep Willekeurig

Een beetje theorie over Java Switch

Stel je voor dat je een ridder bent die stopt bij een splitsing in de weg. Als je naar links gaat, verlies je je paard. Als je rechts gaat, zul je kennis opdoen. Hoe zouden we deze situatie in code weergeven? U weet waarschijnlijk al dat we constructies als als-dan en als-dan-anders gebruiken om deze beslissingen te nemen.

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

Maar wat als de weg zich niet in twee splitst, maar in tien? Je hebt wegen die "helemaal rechts", "iets links daarvan", "iets meer naar links" enzovoort zijn, in totaal 10 mogelijke wegen? Stel je voor hoe je "if-then-else "-code in deze versie zal groeien!

if (option1)
{…}
else if (option2)
{…}
…
else if (optionN) ...
Stel dat je een 10-voudige splitsing in de weg hebt (het is hier belangrijk dat het aantal opties eindig is). Voor dergelijke situaties heeft Java de instructie switch .

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

Dit is hoe de verklaring werkt:
  • ExpressionForMakingAChoice wordt geëvalueerd. Vervolgens vergelijkt de switch-instructie de resulterende waarde met de volgende ValueX (in de volgorde waarin ze worden vermeld).
  • Als ExpressionForMakingAChoice overeenkomt met ValueX, wordt de code na de dubbele punt uitgevoerd.
  • Als een break- instructie wordt aangetroffen, wordt de besturing overgedragen buiten de switch-instructie.
  • Als ExpressionForMakingAChoice met geen enkele ValueX overeenkomt, gaat de besturing over naar CodeForDefaultCase.
Belangrijke punten
  • In de instructie switch moet het type ExpressionForMakingAChoice een van de volgende zijn:

    • byte , short , char , int .
    • Byte , Short , Character , Integer (omhulsels van de primitieve datatypes).
    • Tekenreeks .
    • Opsomming .
  • Het standaardblok is optioneel. Als het afwezig is en ExpressionForMakingAChoice komt met geen enkele ValueX overeen, dan wordt er geen actie uitgevoerd.
  • De break- verklaring is niet vereist. Als deze afwezig is, zal de uitvoering van de code doorgaan (verdere vergelijkingen in de case-statements negerend) tot het eerste optreden van break of tot het einde van de switch- statement.
  • Als dezelfde code voor verschillende keuzes moet worden uitgevoerd, kunnen we duplicatie elimineren door meerdere opeenvolgende case- statements op te geven.

Laten we nu eens kijken hoe de switch-instructie wordt gebruikt in Java

Maak je geen zorgen: we zijn klaar met de theorie. Nadat je de volgende voorbeelden hebt gezien, wordt alles veel duidelijker. Nou, laten we beginnen. Laten we eens kijken naar een voorbeeld uit de astronomie waarbij de planeten van ons zonnestelsel betrokken zijn. In overeenstemming met de laatste internationale opvattingen hebben we Pluto uitgesloten (vanwege de eigenschappen van zijn baan). We herinneren ons dat onze planeten als volgt zijn gerangschikt op basis van hun afstand tot de zon: Mercurius, Venus, Aarde, Mars, Jupiter, Saturnus, Uranus en Neptunus. Laten we een Java-methode schrijven die het rangtelwoord van een planeet neemt (ten opzichte van de afstand tot de zon) en de belangrijkste componenten van de atmosfeer van de planeet retourneert als een Lijst<String>. Je zult je herinneren dat sommige planeten een vergelijkbare atmosferische samenstelling hebben. Venus en Mars bevatten dus voornamelijk koolstofdioxide; de atmosfeer van Jupiter en Saturnus bestaat uit waterstof en helium; en Uranus en Neptunus voegen methaan toe aan het laatste paar gassen. Dit is onze functie:

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;
}
Merk op dat we dezelfde code gebruiken voor planeten met identieke atmosferische samenstellingen. Dit hebben we gedaan door gebruik te maken van opeenvolgende case statements. Als we de samenstelling van de atmosfeer van onze thuisplaneet willen weten, noemen we onze methode met 3 als argument:

getPlanetAtmosphere(3).
System.out.println(getPlanetAtmosphere(3)) returns ["Carbon dioxide", "Nitrogen", "Oxygen"].
Experimenteer met break: wat gebeurt er als we alle break- statements verwijderen? Laten we het proberen:

    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;
    }
Als we het resultaat van System.out.println(getPlanetAtmosphere(3)) afdrukken , dan ontdekken we dat onze thuisplaneet niet zo leefbaar is. Of is het? Oordeel zelf: ["Koolstofdioxide", "Stikstof", "Zuurstof", "Waterstof", "Helium", "Methaan", "Waterstof", "Helium"] . Waarom is dit gebeurd? Het programma voert alle case- statements uit na de eerste match tot het einde van het schakelblok .

Overmatige optimalisatie van break statements

Merk op dat we de methode kunnen verbeteren door de break statements en cases anders te rangschikken.

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;
}
Lijkt op minder code, toch? We hebben het totale aantal verklaringen teruggebracht door te spelen met de volgorde van de casusverklaringen en ze te hergroeperen. Nu wordt elk type gas in slechts één regel code aan de lijst toegevoegd. De code die in het laatste voorbeeld wordt gegeven, is alleen om te laten zien hoe dingen werken. We raden af ​​om op deze manier code te schrijven. Als de auteur van dergelijke Java-code (laat staan ​​andere programmeurs) deze moet onderhouden, zal hij of zij het erg moeilijk vinden om de logica achter de vorming van die hoofdletterblokken en de code die in de switch-instructie wordt uitgevoerd, te reconstrueren .

Verschillen met als

Gezien de uiterlijke overeenkomsten van if- en switch- statements, moet u niet vergeten dat het switch- statement een van de gevallen selecteert op basis van een SPECIFIEKE WAARDE, terwijl het if-statement elke booleaanse uitdrukking kan hebben. Houd hier rekening mee bij het ontwerpen van uw code.

Conclusie

  • Gebruik de case -instructie voor meer dan twee takken om uw code niet vol te proppen met if-instructies.
  • Vergeet niet om het logische blok van de branch voor elke specifieke waarde (case statement) aan te vullen door een break statement in te voegen.
  • De expressie van de switch- instructie kan een Enum of String zijn , evenals enkele primitieve typen.
  • Onthoud het standaardblok . Gebruik het om onverwachte waarden te verwerken.
  • Om de prestaties te optimaliseren, verplaatst u de codetakken die overeenkomen met de meest voorkomende waarden naar het begin van het schakelblok .
  • Laat u niet meeslepen in uw "optimalisatie" door de break- statements aan het einde van de case- statements te verwijderen - dergelijke code is moeilijk te begrijpen en daardoor moeilijk te onderhouden.
Opmerkingen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION