JavaRush /Java блогы /Random-KK /Java тіліндегі ауысу мәлімдемесі

Java тіліндегі ауысу мәлімдемесі

Топта жарияланған
Сіз әйгілі картинадағы кейіпкер сияқты шанышқыда тұрсыз деп елестетіңіз. Сол жаққа барсаң – аттан, оңға барсаң – білім аларсың. Мұндай жағдайды қалай бағдарламалауға болады? Сіз мұндай таңдауды if-then және if-then-else конструкциялары арқылы жасайтынымызды білетін шығарсыз .
if (turn_left) {
    System.out.println(«Коня потеряешь»);
}
if (turn_right) {
    System.out.println(“Знания обретёшь”);
}
else
    System.out.println(“Так и будешь стоять?);
Егер мұндай жолдар екі емес, 10 болса ше? 10 дана көлемінде «оңға», «сәл солға», «сәл көп солға» және т.б. жол бар ма? Бұл нұсқада if-then-else codeыңыз қалай өсетінін елестетіп көріңіз !
if (вариант1)
{}
else if (вариант2)
{}else if (вариантN).
Сонымен, сізде бір шарт жоқ, бірақ бірнеше, айталық, 10 (мұнда маңызды нәрсе - шанышқылар саны шектеулі). Мұндай жағдайлар үшін арнайы таңдау операторы бар - switch case java .
switch (ВыражениеДляВыбора) {
           case  (Значение1):
               Код1;
               break;
           case (Значение2):
               Код2;
               break;
...
           case (ЗначениеN):
               КодN;
               break;
           default:
               КодВыбораПоУмолчанию;
               break;
       }
Өтініштегі орындау тәртібі келесідей:
  • SelectionExpression бағаланады. Әрі қарай, switch операторы алынған өрнекті келесі Мәнмен (тізімде көрсетілген тәртіппен) салыстырады.
  • Егер SelectExpression Мәнге сәйкес келсе, қос нүктеден кейінгі code орындалады.
  • Егер үзіліс конструкциясы кездессе , онда басқару коммутатор пәрменінен тыс тасымалданады.
  • ExpressionForSelection және Values ​​арасында сәйкестік табылмаса, басқару DefaultSelectionCode параметріне тасымалданады.
Маңызды нүктелер
  • Java тіліндегі қосқышты таңдау мәлімдемесі үшін SelectionExpression түрі келесілердің бірі болуы керек:

    • byte , қысқа , char , int .
    • Олардың орауыштары byte , қысқа , таңба , бүтін сан .
    • Жол (Java 7-ден бастап).
    • Тізім ( Enum ).
  • Әдепкі блок міндетті емес, одан кейін SelectionExpression және Values ​​сәйкес келмесе, ешқандай әрекет орындалмайды.
  • үзілісbreak міндетті емес; егер ол жоқ болса, code бірінші коммутатор мәлімдемесі кездескенше немесе соңына дейін орындалуын жалғастырады (іс блоктарындағы мәндерді одан әрі салыстыруды елемеу) .
  • егер бірнеше таңдау опциялары үшін бірдей codeты орындау қажет болса, қайталануды болдырмау үшін оның алдында бірнеше сәйкес мәндерді дәйекті регистр блоктарында көрсетеміз .

Java тіліндегі switch операторын қолдану тәжірибесіне көшейік

Уайымдамаңыз, біз теорияны аяқтадық, ал келесі мысалдардан кейін бәрі әлдеқайда түсінікті болады. Ендеше, бастайық. Күн жүйесінің планеталары туралы астрономиядан мысал қарастырайық. Соңғы халықаралық ережелерге сәйкес, біз Плутонды (оның орбитасының қасиеттеріне байланысты) алып тастаймыз. Біздің планеталар Күннен келесі ретпен орналасқанын еске түсірейік: Меркурий, Венера, Жер, Марс, Юпитер, Сатурн, Уран және Нептун. Кіріс ретінде планетаның реттік нөмірін (Күннен қашықтығына қатысты) алатын және шығыс ретінде осы планетаның атмосферасының негізгі құрамын Тізім < Жол> түрінде шығаратын Java әдісін жасайық . Естеріңізге сала кетейін, кейбір планеталардың атмосфера құрамы ұқсас. Сонымен, Венера мен Марста негізінен көмірқышқыл газы бар, Юпитер мен Сатурн сутегі мен гелийден тұрады, ал Уран мен Нептунда соңғы жұп газдардан басқа метан да бар. Біздің функциямыз:
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;
}
Назар аударыңыз: біз бірдей codeты атмосфералық құрамы бірдей планеталармен салыстырдық. Және біз мұны дәйекті кейс конструкцияларын қолдану арқылы жасадық . Сонымен, егер біз өз планетамыздың атмосферасының құрамын алғымыз келсе, 3 параметрі бар әдісімізді атаймыз:
getPlanetAtmosphere(3).
System.out.println(getPlanetAtmosphere(3)) вернет нам [Углекислый газ, Азот, Кислород].
break арқылы тәжірибе Егер біз барлық үзіліс операторларын алып тастасақ не болады ? Оны тәжірибеде қолданып көрейік:
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;
}
Егер біз әдістің нәтижесін басып шығарсақ System.out.println(getPlanetAtmosphere(3)), онда біздің үй планетамыз өмір сүруге соншалықты қолайлы болмайды. Әлде қолайлы ма? Өзіңіз бағалаңыз: [Көмірқышқыл газы, азот, оттегі, сутегі, гелий, метан, сутегі, гелий], неге бұлай болды? Бағдарлама барлық жағдайларды бірінші сәйкестіктен кейін және коммутатор блогының соңына дейін орындады.

Шамадан тыс оңтайландыру үзілісі

Біз үзіліс директивалары мен таңдау опцияларының басқа орналасуы арқылы әдісті жақсарта алатынымызды ескеріңіз
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;
}
Қысқарақ көрінеді, солай емес пе? Іс тәртібімен ойнау және қайта топтау арқылы мәлімдемелердің жалпы санын азайттық. Енді газдың әрбір түрі тізімге тек бір code жолында қосылады. Әдістің соңғы үлгісінің тізімі жұмысты көрсету үшін ғана көрсетілген, мұндай стильде жазу ұсынылмайды . Егер ұқсас codeтың авторы (және одан да көп үшінші тарап бағдарламашылары) оны сақтауы керек болса, онда таңдау блоктарын қалыптастыру логикасын және java switch операторының орындалатын codeын қалпына келтіру өте қиын болады.

Егер айырмашылығы

if және switch операторлары сыртқы түрі бойынша ұқсас болғанымен , бірнеше таңдау операторының ауыстырып-қосқышы орындау опцияларын таңдауды ЕРЕКШЕЛІ МӘНге негіздейтінін ұмытпаңыз, ал if-де. кез келген логикалық өрнек болуы мүмкін. Кодыңызды жобалау кезінде осы фактіні ескеріңіз. Java-ның әртүрлі нұсқаларындағы коммутаторға арналған инновацияларды толығырақ қарастырайық.

Java 7-де ауысу

Java 7-ге дейін ауыстырғыштың мәні ретінде byte, қысқа, char және int примитивтері пайдаланылуы мүмкін. Сондай-ақ жоғарыда аталған қарабайыр түрлердің санау және орауыштары үшін қолдау болды: таңба, byte, қысқа және бүтін сан. Бірақ жиі біз java коммутатор жолының мәнін табуымыз керек! Бұл Java 6-да келесідей болады:
DayOfWeek day = DayOfWeek.fromValue("Thursday");

switch (day) {
  case MONDAY:
     System.out.println("Today is windy !");
     break;
  case THURSDAY:
     System.out.println("Today is sunny !");
     break;
  case WEDNESDAY:
     System.out.println("Today is rainy!");
     break;
  default:
     System.out.println("Oooops, something wrong !");
Және нөмір:
public enum DayOfWeek {
  MONDAY("Monday"),
  THURSDAY("Thursday"),
  WEDNESDAY("Wednesday"),
  NOT_FOUND("Not found");

  private final String value;

  DayOfWeek(final String value) {
     this.value = value;
  }

  public static DayOfWeek fromValue(String value) {
     for (final DayOfWeek dayOfWeek : values()) {
        if (dayOfWeek.value.equalsIgnoreCase(value)) {
           return dayOfWeek;
        }
     }
     return NOT_FOUND;
  }
}
Бірақ Java 7-ден бастап, коммутатордың мәні ретінде String түрін пайдалануға болады:
String day = "Thursday";

switch (day) {
  case "Monday":
     System.out.println("Today is windy !");
     break;
  case "Thursday":
     System.out.println("Today is sunny !");
     break;
  case "Wednesday":
     System.out.println("Today is rainy!");
     break;
  default:
     System.out.println("Oooops, something wrong !");
}
Жаңа мүмкіндіктерге қарамастан, enum қолдану тәсілі икемді және пайдалануға ұсынылады: біз бұл нөмірді бірнеше рет қайта пайдалана аламыз.

Java 12-ге ауысыңыз

Java 12 үлгіні сәйкестендіруге арналған Switch өрнектерін жақсартты. Жоғарыдағы мысалдағыдай Switch қолданбасын қолдансақ, қандай да бір айнымалының мәнін орнату үшін мәнді есептеп, оны берілген айнымалыға тағайындау керек, содан кейін үзілісті қолданыңыз:
int count = 2;
int value;
switch (count) {
  case 1:
     value = 12;
     break;
  case 2:
     value = 32;
     break;
  case 3:
     value = 52;
     break;
  default:
     value = 0;
}
Бірақ Java 12 мүмкіндіктерінің арқасында біз бұл өрнекті келесідей қайта жаза аламыз:
int value = switch (count) {
  case 1:
     break 12;
  case 2:
     break 32;
  case 3:
     break 52;
  default:
     break 0;
};
Өзгерістерге аздап тоқталайық:
  1. Егер бұрын біз регистр блоктарының ішіне айнымалы мән орнататын болсақ, switch операторының өзі ештеңені қайтара алмайтындықтан, енді бізде мұндай мүмкіндік бар және біз мәнді switch көмегімен тікелей қайтарамыз.

  2. Бұрын біз үзілістің оң жағында ешнәрсеге ие бола алмадық, бірақ қазір оны коммутатордың мәнін қайтару үшін қайтару операторы ретінде пайдаланамыз. Қос нүкте белгілері мәлімдеме блогына кіру нүктесін белгілейді. Яғни, осы сәттен бастап, тіпті басқа белгі кездессе де, төмендегі барлық codeтың орындалуы басталады.

    Нәтиже – белгіден белгіге дейін ұшып өту, оны fall -through деп те атайды.

Java тіліндегі коммутатор операторы - 2Мұндай өтуді аяқтау үшін сіз барлық элементтерді толығымен өтуіңіз керек немесе үзіліс немесе қайтаруды пайдалануыңыз керек. Java 12-дегі инновация бізге лямбда операторын пайдалану мүмкіндігін береді, бұл өз кезегінде оның оң жағындағы codeтың ғана орындалуын қамтамасыз етеді. Ешқандай «сәтсіздіксіз». Бұл жағдайда алдыңғы мысал қандай болады:
int count = 2;
int value = switch (count) {
  case 1 -> 12;
  case 2 -> 32;
  case 3 -> 52;
  default -> 0;
};
Код әлдеқайда қарапайым болды, солай емес пе? Тағы бір нәрсе: лямбда операторы қос нүктенің әдеттегі аналогы ретінде қызмет ете алады, содан кейін кейбір операциялары бар тұтас блок бар:
int count = 2;
int value = switch (count) {
  case 1 -> {
     //some computational operations...
     break 12;
  }
  case 2 -> {
     //some computational operations...
     break 32;
  }
  case 3 -> {
     //some computational operations...
     break 52;
  }
  default -> {
     //some computational operations...
     break 0;
  }
};
Ал, егер кейбір жағдайларда қайтару мәні бірдей болса ше? Кейбір әртүрлі мәндер үшін бізде бірдей жағдайлар бар екені белгілі болды. Java 12-дегі жаңа мүмкіндіктер арқылы оны қалай қысқартуға болады:
int count = 2;
int value = switch (count) {
  case 1, 3, 5 -> 12;
  case 2, 4, 6 -> 52;
  default -> 0;
};

Java 13-ке ауысыңыз

Java 13-де қосқыш мәнді қайтару жолы өзгерді. Егер java 12-де біз коммутатор блогы үшін қайтару қызметін атқарған үзілістен кейін қайтарылатын мәнді жазсақ, енді yield сөзін пайдаланып мәнді қайтарамыз . Қарап көрейік:
int value = switch (count) {
  case 1:
     yield 12;
  case 2:
     yield 32;
  case 3:
     yield 52;
  default:
     yield 0;
};
Сонымен бірге қайтару үшін үзіліс арқылы java 12-де жазылған code компиляцияланбайды (( Java тіліндегі коммутатор операторы - 3үзіліс пайдаланылады, бірақ ештеңені қайтарудың қажеті жоқ жағдайларда.

Барлығы

  • Кодыңызды if құрылымдарымен араластырмау үшін екіден көп тармақ болған кезде case операторын пайдаланыңыз .
  • Белгілі бір мәнге сәйкес келетін әрбір тармақтың логикалық блогын үзіліс шақыруымен аяқтауды ұмытпаңыз .
  • Кейбір қарабайыр түрлерге қосымша, switch операторы Enum және String түрлерін өрнек ретінде де пайдалана алады .
  • Әдепкі блокты есте сақтаңыз - оны жоспарланбаған таңдау мәндерін өңдеу үшін пайдаланыңыз.
  • Өнімділікті оңтайландыру үшін ең көп тараған таңдаулары бар code тармақтарын коммутатор блогының басына жылжытыңыз.
  • Істі таңдау блогының соңындағы үзілістерді алып тастау арқылы «оңтайландыруға» берілмеңіз - мұндай codeты түсіну қиын, нәтижесінде оны әзірлеу кезінде қолдау қиын.
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION