Java и переключатель - PullRequest
       43

Java и переключатель

9 голосов
/ 21 ноября 2008

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

Ответы [ 5 ]

23 голосов
/ 21 ноября 2008

Как сказано здесь , коммутатор работает с примитивными типами байтов, коротких символов, символов типа char и int. Он также работает с перечисляемыми типами и несколькими специальными классами, которые «оборачивают» определенные примитивные типы: Character, Byte, Short и Integer.

Оператор переключения Java компилируется в табличный переключатель байт-кода JVM или переключатель поиска . Оба эти байт-кода требуют, чтобы значения регистра были уникальными, 32-разрядными, целочисленными, константами времени компиляции.

Инструкции tablewitch и lookupswitch включают одно смещение ветви по умолчанию и набор пар длины значение / смещение переменной переменной длины.
Обе инструкции извлекают ключ (значение выражения в скобках, следующее сразу за ключевым словом switch) из стека.
Ключ сравнивается со всеми значениями регистра:

  • Если совпадение найдено, берется смещение ветви, связанное со значением регистра.
  • Если совпадений не найдено, берется смещение по умолчанию.

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

Как сказано в этом Java Bug :

Полагаю, вы могли бы позволить случаям оператора Java switch включать другие типы значений и скомпилировать оператор switch, который использует один из этих типов значений, в другой байт-код, такой как последовательность ifs и gotos. Но тогда нам нужно тщательно изучить все операторы switch, чтобы определить, будет ли он скомпилирован в байт-код быстрого переключения или в медленную последовательность if-elses.

Как сказано в этом другом Java ошибка

операторы 'switch' могут использовать диспетчеризацию таблицы функций и / или поиск в двоичном дереве, чтобы быстрее сопоставлять операторы case, чем просто проверять их по порядку.

1 голос
/ 21 ноября 2008

Scala, язык, построенный на основе JVM, позволяет вам определять свои собственные классы case, которые вы можете использовать в операторе switch. Таким образом, использование long или double или Strings в операторе switch безусловно возможно.

Однако я не знаю, насколько это сложно и насколько эффективно. Для простых типов компилятор просто вычисляет смещение для перехода по таблице. Это определенно не относится к более сложным типам.

Я полагаю, что ответ имеет отношение к тому времени, когда была разработана Java, и к целям, которых пытались достичь дизайнеры. Первоначальные цели Java заключались в разработке «лучшего C ++», переносимого во многих средах. Я могу понять, почему переключатель на сложные типы не подходит.

0 голосов
/ 28 марта 2010

Если вы обнаружите, что собственная конструкция переключателя Java слишком ограничена, взгляните на lambdaj Switcher , который позволяет декларативно включать любой объект, сопоставляя его с некоторыми сопоставителями хамкрестов.

0 голосов
/ 21 ноября 2008

Я предполагаю, что long было отброшено как допустимый тип выражения переключения из-за / связано с тем, что операции над длинными переменными могут быть не атомарными .

0 голосов
/ 21 ноября 2008

Может быть, потому, что программирование - это действительно плохо, когда в переключателе больше чем целочисленные максимальные значения?

Если вы хотите переключать длинные переменные, просто перенесите их в пространство между ними.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...