JavaRush /Блоги Java /Random-TG /Гузариш изҳорот дар 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 дар ин version афзоиш хоҳад ёфт!
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 арзёбӣ мешавад. Баъдан, изҳороти гузариш ифодаи натиҷаро бо арзиши навбатӣ (бо тартиби рӯйхатшуда) муқоиса мекунад.
  • Агар SelectExpression ба Арзиш мувофиқат кунад, пас codeи пас аз ду нуқта иҷро карда мешавад.
  • Агар сохтори танаффус дучор шавад , пас идоракунӣ берун аз фармони гузариш интиқол дода мешавад.
  • Агар байни ExpressionForSelection ва Values ​​ягон мувофиқат пайдо нашавад, назорат ба DefaultSelectionCode интиқол дода мешавад.
Нуқтаҳои муҳим
  • Навъи SelectionExpression барои изҳороти интихоби гузариш дар Java бояд яке аз зерин бошад:

    • byte , кӯтоҳ , char , int .
    • Рамзҳои онҳо byte , кӯтоҳ , аломат , адад мебошанд .
    • Стринг (аз Java 7).
    • Рӯйхат ( Enum ).
  • Блоки пешфарз ихтиёрӣ аст, пас агар SelectionExpression ва Values ​​мувофиқат накунанд, ҳеҷ амал иҷро намешавад.
  • танаффус ихтиёрӣ аст; агар он мавҷуд набошад, code иҷроишро идома медиҳад (ба назар гирифтани муқоисаи минбаъдаи арзишҳо дар блокҳои парванда) то breakбаёнияи аввалини гузариш дучор шудан ё то ба охир мерасад.
  • агар барои якчанд вариантҳои интихобӣ иҷро кардани як code зарур бошад, барои пешгирӣ кардани такрор мо дар пеши он дар блокҳои пайдарпай якчанд арзишҳои мувофиқро нишон медиҳем .

Биёед ба амалияи истифодаи баёнияи switch дар Java гузарем

Парво накунед, мо бо назария тамом шудем ва пас аз мисолҳои минбаъда ҳама чиз равшантар мешавад. Пас биёед оғоз кунем. Биёед мисолеро аз астрономия дар бораи сайёраҳои системаи Офтоб дида бароем. Мувофики коидахои охирини байналхалкй мо Плутонро (аз руи хусусиятхои мадори он) хорич мекунем. Дар хотир дорем, ки сайёраҳои мо аз Офтоб бо пайдарпаии зерин ҷойгир шудаанд: Меркурий, Зуҳра, Замин, Миррих, Муштарӣ, Сатурн, Уран ва Нептун. Биёед усули 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)) вернет нам [Углекислый газ, Азот, Кислород].
Таҷриба бо танаффус Чӣ мешавад, агар мо ҳама изҳороти танаффусро нест кунем ? Биёед инро дар амал кӯшиш кунем:
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и шабеҳ онро нигоҳ доштан лозим бошад, пас барқарор кардани мантиқи ташаккули блокҳои интихобӣ ва рамзи иҷрошавандаи изҳороти switch-и java хеле душвор хоҳад буд.

Тафовут аз if

Дар ҳоле ки изҳороти if ва switch аз рӯи намуди зоҳирӣ шабеҳанд , фаромӯш накунед, ки коммутатори оператори интихоби чандкарата интихоби имконоти иҷроро ба АРЗИШИ МАХСУС асос мекунад, дар ҳоле ки дар if. метавонад ҳама гуна ифодаи мантиқӣ бошад. Ҳангоми таҳияи codeи худ ин далелро ба назар гиред. Биёед ба навовариҳои гузариш дар versionҳои гуногуни Java бодиққат назар кунем.

Гузариш дар Java 7

Пеш аз Java 7, byte, кӯтоҳ, char ва int ибтидоӣ метавонистанд ҳамчун арзиш барои гузариш истифода шаванд. Инчунин дастгирӣ барои рақамҳо ва бастабандҳои намудҳои ибтидоии дар боло номбаршуда мавҷуд буд: Характер, Байт, Кӯтоҳ ва Бутун. Аммо аксар вақт ба мо лозим аст, ки арзиши сатри гузариш 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ро барои мувофиқати намуна такмил додааст. Агар мо Гузаришро тавре ки дар мисоли боло истифода барем, барои муқаррар кардани арзиши баъзе тағирёбанда, мо бояд арзишро ҳисоб карда, онро ба тағирёбандаи додашуда таъин кунем ва сипас break-ро истифода барем:
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. Агар қаблан мо дар дохor блокҳои case арзиши тағирёбандаро муқаррар карда будем, азбаски худи изҳороти switch ҳеҷ чизро баргардонида наметавонист, ҳоло мо чунин имконият дорем ва мо мустақиман арзишро бо истифодаи switch бармегардонем.

  2. Пештар, мо дигар чизе дар тарафи рости танаффус дошта наметавонистем, аммо ҳоло мо онро ҳамчун изҳороти бозгашт барои баргардонидани арзиши коммутамон истифода мебарем. Аломатҳои ду нуқта нуқтаи вурудро ба блоки изҳорот қайд мекунанд. Яъне аз ҳамон лаҳза иҷрои ҳамаи codeҳои дар поён овардашуда оғоз мешавад, ҳатто вақте ки тамғаи дигар дучор мешавад.

    Дар натиҷа гузариш аз тамға ба тамға ба охир мерасад, ки онро fall -through низ меноманд.

Изҳороти гузариш дар Java - 2Барои анҷом додани чунин гузариш, шумо бояд ё аз тамоми унсурҳо гузаред, ё танаффус ё бозгаштро истифода баред. Навоварӣ дар java 12 ба мо имкон медиҳад, ки оператори lambda-ро истифода барем, ки дар навбати худ кафолат медиҳад, ки танҳо 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 навишташуда бо истифода аз танаффус барои баргаштан тартиб дода намешавад (( Изҳороти гузариш дар Java - 3Танаффус истифода мешавад, аммо дар ҳолатҳое, ки ба мо лозим нест, ки чизе баргардонем.

Ҳамагӣ

  • Используйте оператор case при числе ветвлений более двух, чтобы не загромождать if-структурами code.
  • Не забывайте завершать логический блок каждой ветки соответствующего конкретному значению (блок case) вызовом break.
  • Оператор switch помимо некоторых примитивных типов, в качестве выражения может использовать также типы Enum и String.
  • Помните про блок default – употребляйте его для обработки незапланированных значений выбора.
  • Для оптимизации производительности переместите ветки codeа с наиболее часто встречающимися вариантами выбора к началу блока switch.
  • Не увлекайтесь «оптимизацией» за счёт удаления break в конце блока выбора case – такой code сложен для понимания, и, How следствие, тяжело сопровождать при его развитии.
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION