Работа с конструкциями if-else, switch-case в javascript

The JavaScript Switch Statement

Use the statement to select one of many code blocks to be executed.

Syntax

switch(expression) {
  case x:    // code block    break;
  case y:    // code block    break;
  default:
    // code block
}

This is how it works:

  • The switch expression is evaluated once.
  • The value of the expression is compared with the values of each case.
  • If there is a match, the associated block of code is executed.
  • If there is no match, the default code block is executed.

Example

The method returns the weekday as a number between
0 and 6.

(Sunday=0, Monday=1, Tuesday=2 ..)

This example uses the weekday number to calculate the weekday name:

switch (new Date().getDay()) {
  case 0:
    day = «Sunday»;
    break;
  case 1:
    day = «Monday»;
    break;
  case 2:
     day = «Tuesday»;
    break;
  case 3:
    day = «Wednesday»;
    break;
  case 4:
    day = «Thursday»;
    break;
  case 5:
    day = «Friday»;
    break;
  case 6:
    day = «Saturday»;
}

The result of day will be:

Switch Ranges

There might be an occasion in which you will need to evaluate a range of values in a block, as opposed to a single value as in our example above. We can do this by setting our expression to and doing an operation within each statement.

To make this easier to understand, we will use a familiar example. In the conditional statements tutorial, we made a simple grading app which would take a number score and convert it to a letter grade, with the following requirements.

  • Grade of 90 and above is an A
  • Grade of 80 to 89 is a B
  • Grade of 70 to 79 is a C
  • Grade of 60 to 69 is a D
  • Grade of 59 or below is an F

Now we can write that as a statement. Since we’re checking a range, we will perform the operation in each to check if each expression is evaluating to then break out of the statement once the requirements for have been satisfied.

grades.js

The expression in parentheses to be evaluated is in this example. This means that any that evaluates to will be a match.

Just like with , is evaluated from top to bottom, and the first true match will be accepted. Therefore, even though our variable is and therefore evaluates to for C and D as well, the first match is B, which will be the output.

JavaScript

JS Array
concat()
constructor
copyWithin()
entries()
every()
fill()
filter()
find()
findIndex()
forEach()
from()
includes()
indexOf()
isArray()
join()
keys()
length
lastIndexOf()
map()
pop()
prototype
push()
reduce()
reduceRight()
reverse()
shift()
slice()
some()
sort()
splice()
toString()
unshift()
valueOf()

JS Boolean
constructor
prototype
toString()
valueOf()

JS Classes
constructor()
extends
static
super

JS Date
constructor
getDate()
getDay()
getFullYear()
getHours()
getMilliseconds()
getMinutes()
getMonth()
getSeconds()
getTime()
getTimezoneOffset()
getUTCDate()
getUTCDay()
getUTCFullYear()
getUTCHours()
getUTCMilliseconds()
getUTCMinutes()
getUTCMonth()
getUTCSeconds()
now()
parse()
prototype
setDate()
setFullYear()
setHours()
setMilliseconds()
setMinutes()
setMonth()
setSeconds()
setTime()
setUTCDate()
setUTCFullYear()
setUTCHours()
setUTCMilliseconds()
setUTCMinutes()
setUTCMonth()
setUTCSeconds()
toDateString()
toISOString()
toJSON()
toLocaleDateString()
toLocaleTimeString()
toLocaleString()
toString()
toTimeString()
toUTCString()
UTC()
valueOf()

JS Error
name
message

JS Global
decodeURI()
decodeURIComponent()
encodeURI()
encodeURIComponent()
escape()
eval()
Infinity
isFinite()
isNaN()
NaN
Number()
parseFloat()
parseInt()
String()
undefined
unescape()

JS JSON
parse()
stringify()

JS Math
abs()
acos()
acosh()
asin()
asinh()
atan()
atan2()
atanh()
cbrt()
ceil()
cos()
cosh()
E
exp()
floor()
LN2
LN10
log()
LOG2E
LOG10E
max()
min()
PI
pow()
random()
round()
sin()
sqrt()
SQRT1_2
SQRT2
tan()
tanh()
trunc()

JS Number
constructor
isFinite()
isInteger()
isNaN()
isSafeInteger()
MAX_VALUE
MIN_VALUE
NEGATIVE_INFINITY
NaN
POSITIVE_INFINITY
prototype
toExponential()
toFixed()
toLocaleString()
toPrecision()
toString()
valueOf()

JS OperatorsJS RegExp
constructor
compile()
exec()
g
global
i
ignoreCase
lastIndex
m
multiline
n+
n*
n?
n{X}
n{X,Y}
n{X,}
n$
^n
?=n
?!n
source
test()
toString()

(x|y)
.
\w
\W
\d
\D
\s
\S
\b
\B
\0
\n
\f
\r
\t
\v
\xxx
\xdd
\uxxxx

JS Statements
break
class
continue
debugger
do…while
for
for…in
for…of
function
if…else
return
switch
throw
try…catch
var
while

JS String
charAt()
charCodeAt()
concat()
constructor
endsWith()
fromCharCode()
includes()
indexOf()
lastIndexOf()
length
localeCompare()
match()
prototype
repeat()
replace()
search()
slice()
split()
startsWith()
substr()
substring()
toLocaleLowerCase()
toLocaleUpperCase()
toLowerCase()
toString()
toUpperCase()
trim()
valueOf()

Шаблоны и условия использованияPatterns and case guards

В выражениях switch поддерживаются многие шаблоны.Many patterns are supported in switch expression arms. В предыдущем примере использовался шаблон константы.The preceding example uses a constant pattern. Шаблон константы сравнивает выражение диапазона со значением.A constant pattern compares the range expression to a value. Это значение должно быть константой времени компиляции.That value must be a compile-time constant. Шаблон типа сравнивает выражение диапазона с известным типом.The type pattern compares the range expression to a known type. В следующем примере из последовательности извлекается третий элемент.The following example retrieves the third element from a sequence. В нем используются различные методы, основанные на типе последовательности:It uses different methods based on the type of the sequence:

Шаблоны могут быть рекурсивными, где шаблон проверяет тип, и если этот тип соответствует, шаблон соответствует одному или нескольким значениям свойств в выражении диапазона.Patterns can be recursive, where a pattern tests a type, and if that type matches, the pattern matches one or more property values on the range expression. Для расширения предыдущего примера можно использовать рекурсивные шаблоны.You can use recursive patterns to extend the preceding example. Вы добавляете ветви выражения switch для массивов, которые содержат менее 3 элементов.You add switch expression arms for arrays that have fewer than 3 elements. Рекурсивные шаблоны показаны в примере ниже.Recursive patterns are shown in the following example:

Рекурсивные шаблоны могут проверять свойства выражения диапазона, но не могут выполнять произвольный код.Recursive patterns can examine properties of the range expression, but can’t execute arbitrary code. Чтобы обеспечить аналогичные проверки для других типов последовательностей, можно использовать условие регистра указанное в предложении .You can use a case guard, specified in a clause, to provide similar checks for other sequence types:

Наконец, для перехвата аргументов можно добавить шаблоны и , которые не обрабатываются ни одной ветвью выражения switch.Finally, you can add the pattern and the pattern to catch arguments that aren’t processed by any other switch expression arm. Это делает выражения switch исчерпывающими, что означает, что будет обрабатываться любое возможное значение выражения диапазона.That makes the switch expression exhaustive, meaning any possible value of the range expression is handled. В следующем примере добавляются такие ветви выражения:The following example adds those expression arms:

В предыдущем примере добавляется шаблон , а шаблон типа меняется на шаблон .The preceding example adds a pattern, and changes the type pattern to a pattern. В качестве ветви выражения switch шаблон содержит проверку значения null.The pattern provides a null check as a switch expression arm. Выражение для этой ветви создает исключение ArgumentNullException.The expression for that arm throws an ArgumentNullException. Шаблон соответствует всем входным данным, которые не совпали с предыдущими ветвями.The pattern matches all inputs that haven’t been matched by previous arms. Он должен появиться после проверки , иначе он будет совпадать с входными файлами .It must come after the check, or it would match inputs.

Дополнительные сведения см. в предложении языка C# для .You can read more in the C# language spec proposal for .

Оператор if

Для организации условного ветвления язык C# унаследовал от С и С++ конструкцию
if…else. Ее синтаксис должен быть интуитивно понятен для любого, кто программировал на процедурных языках:

if (условие)
  оператор (операторы)
else
  оператор (операторы)

Если по каждому из условий нужно выполнить более одного оператора, эти операторы
должны быть объединены в блок с помощью фигурных скобок {…}. (Это также касается других конструкций C#, в которых операторы могут быть объединены в блок — таких
как циклы for и while.)

Стоит обратить внимание, что в отличие от языков С
и С++, в C# условный оператор if может работать только с булевскими выражениями, но не с
произвольными значениями вроде -1 и 0. В операторе if могут применяться сложные выражения, и он может содержать операторы else, обеспечивая выполнение более сложных проверок

Синтаксис похож
на применяемый в аналогичных ситуациях в языках С (С++) и Java. При построении
сложных выражений в C# используется вполне ожидаемый набор логических операторов. Давайте рассмотрим следующий пример:

В операторе if могут применяться сложные выражения, и он может содержать операторы else, обеспечивая выполнение более сложных проверок. Синтаксис похож
на применяемый в аналогичных ситуациях в языках С (С++) и Java. При построении
сложных выражений в C# используется вполне ожидаемый набор логических операторов. Давайте рассмотрим следующий пример:

Как видите количество else if, добавляемых к единственному if, не ограничено. Один момент, который следует отметить касательно if: фигурные скобки применять
не обязательно, если в условной ветви присутствует только один оператор, как показано в исходном примере.

Проблема с операторами в switch

Прежде, чем мы перейдем к обзору нововведений в switch, давайте быстро оценим одну ситуацию. Допустим, мы столкнулись с «ужасным» тернарным булеаном и хотим преобразовать его в обычный булеан. Вот один из способов сделать это:

Согласитесь, что это очень неудобно. Как и многие другие варианты switch, встречающиеся в «природе», представленный выше пример просто вычисляет значение переменной и присваивает его, но реализация обходная (объявляем идентификатор и используем его позже), повторяющаяся (мои ‘и всегда результат copy-pasta) и подвержена ошибкам (забыл еще одну ветку? Ой!). Тут явно есть, что улучшить.

Давайте попробуем решить эти проблемы, поместив switch в отдельный метод:

Так намного лучше: отсутствует фиктивная переменная, нет ‘ов, загромождающих код и сообщений компилятора об отсутствии (даже если в этом нет необходимости, как в данном случае).

Но, если подумать, то мы не обязаны создавать методы только для того, чтобы обойти неуклюжую особенность языка. И это даже без учёта, что такой рефакторинг не всегда возможен. Нет, нам нужно решение получше!

Оператор case и предложение whenThe case statement and the when clause

Начиная с C# 7.0 операторы case необязательно должны быть взаимоисключающими. В связи с этим можно добавить предложение , определяющее дополнительное условие, которому должен соответствовать оператор case, чтобы иметь значение true.Starting with C# 7.0, because case statements need not be mutually exclusive, you can add a clause to specify an additional condition that must be satisfied for the case statement to evaluate to true. Предложение может быть любым выражением, возвращающим логическое значение.The clause can be any expression that returns a Boolean value.

В следующем примере определяется базовый класс , класс , производный от , и класс , производный от .The following example defines a base class, a class that derives from , and a class that derives from . Предложение используется в нем для того, чтобы с помощью обрабатывался объект , которому назначена такая же длина и ширина, как у объекта , даже если он не был инициализирован как объект .It uses the clause to ensure that the treats a object that has been assigned equal lengths and widths as a even if it hasn’t been instantiated as a object. Метод не пытается отобразить сведения ни об объекте со значением , ни о форме с нулевой областью.The method doesn’t attempt to display information either about an object that is or a shape whose area is zero.

Обратите внимание на то, что предложение в этом примере, проверяющее, имеет ли объект значение , не выполняется.Note that the clause in the example that attempts to test whether a object is doesn’t execute. Правильный шаблон пути для проверки на наличие значения — .The correct type pattern to test for a is

Оператор Switch

Рассмотрим пример из темы «ветвления». Программа выводит название дня недели по порядковому номера

#include<conio.h>
#include<stdio.h>

int main() {
	unsigned day;

	printf("Enter day ");
	scanf("%d", &day);

	if (day > 7) {
		day = day % 7;
	}

	if (day == 0) {
		printf("Sunday");
	} else if (day == 1) {
		printf("Monday");
	} else if (day == 2) {
		printf("Tuesday");
	} else if (day == 3) {
		printf("Wednesday");
	} else if (day == 4) {
		printf("Thursday");
	} else if (day == 5) {
		printf("Friday");
	} else if (day == 6) {
		printf("Saturday");
	} 

	getch();
}

Этот код состоит из семи идущих друг за другом операторов if. Его код можно упростить с помощью оператора switch

#include<conio.h>
#include<stdio.h>

int main() {
	unsigned day;

	printf("Enter day ");
	scanf("%d", &day);

	if (day > 7) {
		day = day % 7;
	}

	switch (day) {
	case 0:
		printf("Sunday");
		break;
	case 1:
		printf("Monday");
		break;
	case 2:
		printf("Tuesday");
		break;
	case 3:
		printf("Wednesday");
		break;
	case 4:
		printf("Thursday");
		break;
	case 5:
		printf("Friday");
		break;
	default:
		printf("Saturday");
	}

	getch();
}

Оператор switch принимает в качестве аргумента число, и в зависимости от его значения выполняет те или иные команды.

switch (<переменная>) {
	case <значение 1>:
		<ветвь 1>
	
	
}

Если значение переменной не соответствует ни одному case, то выполняется default ветвь. Она может отсутствовать, тогда вообще ничего не выполняется.

В примере выше каждая ветвь оканчивается оператором break

Это важно. Когда компьютер видит оператор break, он выходит из оператора switch

Если бы он отсутствовал, то программа «провалилась» бы дальше, и стала выполнять следующие ветви.

#include<conio.h>
#include<stdio.h>

int main() {
	unsigned day;

	printf("Enter day ");
	scanf("%d", &day);

	if (day > 7) {
		day = day % 7;
	}

	switch (day) {
	case 0:
		printf("Sunday");
	case 1:
		printf("Monday");
	case 2:
		printf("Tuesday");
	case 3:
		printf("Wednesday");
	case 4:
		printf("Thursday");
	case 5:
		printf("Friday");
	default:
		printf("Saturday");
	}

	getch();
}

Введите значение, например 3, и вы увидите, что программа выведет

WednesdayThursdayFridaySaturday

то есть все ветви, после найденной.

Операторы каждой из ветвей могут быть обрамлены фигурными скобками (и так даже лучше).
Тогда каждая из ветвей будет отдельным блоком, в котором можно определять свои переменные.
Пример программы, которая запрашивает у пользователя число, оператор и второе число и выполняет действие.

#include <conio.h>
#include <stdio.h>
#include <stdlib.h>

int main() {
	float a, b, c;
	char op;

	scanf("%f %c %f", &a, &op, &b);
	switch (op) {
		case '+': {
			c = a + b;
			break;
		}
		case '-': {
			c = a - b;
			break;
		}
		case '/': {
			if (b != 0.0) {
				c = a / b;
			} else {
				printf("Error: divide by zero");
				getch();
				exit(1);
			}
			break;
		}
		case '*': {
			c = a * b;
			break;
		}
		default:
			printf("No operation defined");
			getch();
			exit(1);
	}

	printf("%.6f", c);
	getch();
}

Если ввести

1 + 2

то будет выведен результат операции 1 + 2 = 3

Хочу обратить внимание, что литеры типа ‘+’ и т.п. воспринимаются в качестве чисел, поэтому их можно использовать в операторе switch

В этой программе использовалась функция exit из библиотеки stdlib. Функция останавливает работу программы и возвращает результат её работы. Если возвращается истина (ненулевое значение), то это значит, что программа была выполнена с ошибкой.

Ветвь default может располагаться в любом месте, не обязательно в конце. Этот код также будет нормально работать

    switch (day) {
    case 0:
        printf("Sunday");
        break;
    case 1:
        printf("Monday");
        break;
    case 2:
        printf("Tuesday");
        break;
    case 3:
        printf("Wednesday");
        break;
    case 4:
        printf("Thursday");
        break;
	default:
        printf("Saturday");
		break;
    case 5:
        printf("Friday");
        break;
    }

default здесь также нуждается в операторе break, как и другие ветви, иначе произойдёт сваливание вниз. Несмотря на то, что так можно писать, это плохой стиль программирования. Ветвь default
логически располагается в конце, когда других вариантов больше нет.

Возможные значения аргумента оператора switch могут располагаться в любом порядке, но должны быть константными значеними. Это значит, что следующий код не заработает

#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
 
int main() {
//Это, конечно, константа, но не может быть использована как
//значение для оператора switch
	const int monday = 0;
    unsigned day;
 
    printf("Enter day ");
    scanf("%d", &day);
 
    if (day > 7) {
        day = day % 7;
    }
 
    switch (day) {
    case monday:
        printf("Sunday");
        break;
    case 1:
        printf("Monday");
        break;
    case 2:
        printf("Tuesday");
        break;
    case 3:
        printf("Wednesday");
        break;
    case 4:
        printf("Thursday");
        break;
	default:
        printf("Saturday");
		break;
    case 5:
        printf("Friday");
        break;
    }
 
    getch();
}

Q&A

Всё ещё не понятно? – пиши вопросы на ящик

JAVA 12

  1. Если ранее мы задавали переменной значение внутри блоков case, так как сам оператор switch не мог ничего возвращать, сейчас такая возможность у нас есть, и мы непосредственно с помощью switch возвращаем значение.

  2. Ранее справа от break у нас уже ничего не могло стоять, а сейчас мы его используем как оператор return для возвращения значения нашим switch.
    Метки с двоеточием отмечают точку входа в блок операторов. То есть с того места начинается выполнение всего кода ниже, даже тогда, когда встречается другая метка.

    Как итог — сквозной переход от метки к метке, который еще называют проваливанием (fall-through).

Multiple Cases

You may encounter code in which multiple s should have the same output. In order to accomplish this, you can use more than one for each block of code.

In order to test this, we are going to make a small application matching the current month to the appropriate season. First, we will use the method to find a number corresponding to the current month, and apply that to the variable.

The method will output a number from to , with being January and being December. At the time of this publication, the month is September, which will correspond to .

Our application will output the four seasons with the following specifications for simplicity:

  • Winter: January, February, and March
  • Spring: April, May, and June
  • Summer: July, August, and September
  • Autumn: October, November, and December

Below is our code.

seasons.js

When we run the code, we’ll receive output identifying the current season based on the specifications above.

The current month at the time of publication was , which corresponded to one of the statements with the season output.

Оператор switch

Часто вместо нескольких расположенных подряд операторов целесообразно воспользоваться специальной конструкцией . Оператор switch сравнивает значение условного выражения с несколькими значениями. Как правило, в качестве выражения используется переменная, в зависимости от значения которой должен быть исполнен тот или иной блок кода. Для сравнения в используется оператор равенства ().

Представим себе переменную , которая может иметь значения (прыгать), (плавать), (летать). Оператор позволяет легко определить блок кода, который должен исполняться для каждого из этих значений. Чтобы показать разницу между операторами и , выполним проверку переменной на соответствие нескольким значениям. Следующий пример показывает два различных способа сделать то же самое. Первый способ использует серию операторов и , а второй — оператор :

<?php

  $action = 'JUMP';

  if ($action == 'JUMP') {
    echo "Мне нравится прыгать.";
  } elseif ($action == 'SWEEM') {
    echo "Я люблю плавать.";
  } elseif ($action == 'FLY') {
    echo "Хотел бы я научиться летать.";
  }

  switch ($action) {
    case 'JUMP':
      echo "Мне нравится прыгать.";
      break;
    case 'SWEEM':
      echo "Я люблю плавать.";
      break;
    case 'FLY':
      echo "Хотел бы я научиться летать.";
      break;
  }

?>

Оператор берет значение, возвращаемое условным выражением, и начинает сравнивать его со всеми значениями, стоящими рядом с ключевым словом (метка), в порядке их следования. Как только совпадение обнаружено, выполняется соответствующий блок кода. Если соответствие не найдено, не исполняется ни один из блоков.

Примечание: условное выражение должно возвращать значение элементарного типа, например число или строку.

Размышление

Из статьи мы узнали, что Java 12 превращает в выражение, наделяя его новыми возможностями:

  • теперь один может соответствовать нескольким меткам;
  • новая стрелочная форма следует синтаксису лямбда-выражений:
    • допускаются однострочные операторы или блоки;
    • предотвращается сквозной переход к следующему ;
  • теперь всё выражение оценивается, как значение, которое затем может быть присвоено переменной или передано, как часть более крупного оператора;
  • множественное выражение: если целевой тип известен, то все ветки должны ему соответствовать. В противном случае определяется конкретный тип, который соответствует всем веткам;
  • может возвращать значение из блока;
  • для выражения использующее , компилятор проверяет охват всех его значений. Если отсутствует, добавляется ветка, которая вызывает исключение.

Куда это нас приведет? Во-первых, поскольку это не окончательная версия , у вас все еще есть время, чтобы оставить отзыв в списке рассылки Amber, если вы с чем-то не согласны.

Затем, предполагая, что switch остается таким, каким он является в данный момент, я думаю, что стрелочная форма станет новым вариантом по умолчанию. Без сквозного перехода к следующему и с лаконичными лямбда-выражениями (это очень естественно иметь case и один оператор в одной строке) выглядит намного компактнее и не ухудшает читаемость кода. Я уверен, что буду использовать только двоеточие, если у меня возникнет необходимость в сквозном проходе.

Что вы думаете? Довольны тем, как все сложилось?

Подробнее о выражениях switch

И последнее, но не менее важное — особенности использования в качестве выражения:

  • множественные выражения;
  • ранний возврат (досрочный );
  • охват всех значений.

Обратите внимание, что при этом не имеет значения, какая форма используется!

Множественные выражения

Switch-выражения являются множественными выражениями. Это означает, что они не имеют своего собственного типа, но могут быть одним из нескольких типов. Наиболее часто в качестве таких выражений используются лямбда-выражения: , могут быть , но также могут быть или .

С помощью switch-выражений тип определяется по взаимодействию между тем, где используется switch и типами его веток. Если switch-выражение назначается типизированной переменной, передается в качестве аргумента или иным образом используется в контексте, где известен точный тип (это называется целевым типом), то все его ветки должны соответствовать этому типу. Вот что мы делали до сих пор:

Как итог — присваивается переменной типа . Следовательно, является целевым типом, и все ветки должны возвращать результат типа .

То же самое происходит и здесь:

А что произойдет сейчас?

(Про использование типа var читайте в нашей прошлой статье 26 рекомендаций по использованию типа var в Java — примечание переводчика)

Если целевой тип неизвестен, из-за того, что мы используем var, тип вычисляется путем нахождения наиболее конкретного супертипа из типов, создаваемых ветками.

Ранний возврат

Следствием различия между выражением и оператором является то, что вы можете использовать для выхода из оператора :

… вы не можете использовать внутри выражения …

Это имеет смысл независимо от того, используете ли вы стрелку или двоеточие.

Покрытие всех вариантов

Если вы используете в качестве оператора, тогда не имеет значения, охвачены все варианты или нет. Конечно, вы можете случайно пропустить , и код будет работать неправильно, но компилятору все равно — вы, ваша IDE и ваши инструменты анализа кода останетесь с этим наедине.

Switch-выражения усугубляют эту проблему. Куда следует перейти , если нужная метка отсутствует? Единственный ответ, который может дать Java — это возвращать для ссылочных типов и значение по умолчанию для примитивов. Это породило бы множество ошибок в основном коде.

Чтобы предотвратить такой исход, компилятор может помочь вам. Для switch-выражений компилятор будет настаивать, чтобы все возможные варианты были охвачены. Давайте посмотрим на пример, который может привести к ошибке компиляции:

Интересным является следующее решение: добавление ветки , конечно, исправит ошибку, но это не является единственным решением — еще можно добавить для .

Да, компилятор наконец-то сможет определить, охватываются ли все значения enum (исчерпывают ли все варианты), и не установить бесполезные значения по умолчанию! Давайте посидим минуту в безмолвной благодарности.

Хотя, это все же вызывает один вопрос. Что делать, если кто-то возьмет и превратит сумасшедший Bool в кватернионный Boolean, добавив четвертое значение? Если вы перекомпилируете switch-выражение для расширенного Bool, то получите ошибку компиляции (выражение больше не является исчерпывающим). Без перекомпиляции это превратится в проблему во время выполнения. Чтобы отловить эту проблему, компилятор переходит в ветку , которая ведет себя так же, как та, которую мы использовали до сих пор, вызывая исключение.

В Java 12 охват всех значений без ветки работает только для , но когда в будущих версиях Java станет более мощным, он также сможет работать с произвольными типами. Если метки ‘ов смогут не только проверять равенство, но и проводить сравнения (например _ < 5 -> …) — это позволит охватить все варианты для числовых типов.

Итого

  • Используйте оператор при числе ветвлений более двух, чтобы не загромождать if-структурами код.
  • Не забывайте завершать логический блок каждой ветки соответствующего конкретному значению (блок case) вызовом .
  • Оператор switch помимо некоторых примитивных типов, в качестве выражения может использовать также типы и .
  • Помните про блок – употребляйте его для обработки незапланированных значений выбора.
  • Для оптимизации производительности переместите ветки кода с наиболее часто встречающимися вариантами выбора к началу блока switch.
  • Не увлекайтесь «оптимизацией» за счёт удаления в конце блока выбора – такой код сложен для понимания, и, как следствие, тяжело сопровождать при его развитии.
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *