Рассмотрим этот простой пример JavaScript.
var SwitchCases = [
// case 1
function() { return "one"; },
// case 2
function() { return "two"; },
// case 3
function() { return "three"; },
// default
function() { return ""; }
];
var SwitchCaseMin = 1;
var SwitchCaseMax = 3;
var SwitchCaseDefault = true;
function FakeSwitchCase(switch) {
if(switch > SwitchCaseMax || switch < SwitchCaseMin) {
if(SwitchCaseDefault == true) {
return SwitchCases[SwitchCases.length-1]();
}
} else {
return SwitchCases[switch - SwitchCaseMin]();
}
}
Ключевая часть:
SwitchCases[switch - SwitchCaseMin]();
Представьте, что во многих случаях код, который их оценивает, не будет расти больше, но еслимы использовали IF..ELSE IF ... ELSE, время выполнения будет расти с каждым добавленным регистром.
В реальной реализации коммутатора SwitchCases (из приведенного выше кода) будет массивом / справочной таблицейметок (читай: смещения) к местам в функции, где появились блоки кода случая.
РЕДАКТИРОВАТЬ
В Java вышеприведенный случай переключения будет скомпилирован вследующий байт-код
[tableswitch 0xAA]
[padding bytes 0x00 or 0x0000 or 0x000000]
[offset of SwitchCases[3]] // default case
[SwitchCaseMin] // 1
[SwitchCaseMax] // 3
[offset of SwitchCases[0]] // case 1
[offset of SwitchCases[1]] // case 2
[offset of SwitchCases[2]] // case 3