Если вы имеете в виду «самый эффективный» под «лучшим», читайте дальше.
Я предлагаю использовать следующий метод, если их действительно много.
Строка в Switch на самом деле что-то будетбыть в Java 7. (Как часть Project Coin )
И, согласно предложению , именно так будет реализован язык Java.
Перваявычисляется хеш-значение каждой из строк.Эта проблема является тогда проблемой "switch int", которая доступна на большинстве современных языков и является эффективной.В каждом из операторов case вы затем проверяете, действительно ли это строка (в очень редких случаях различные строки могут хэшировать одно и то же значение int).
Лично я иногда не выполняю последний шаг на практике, поскольку его необходимость зависитв ситуации, в которой находится ваша конкретная программа, т.е. находятся ли возможные строки под контролем программиста и насколько надежной должна быть программа.
Пример псевдокода, соответствующий
String s = ...
switch(s) {
case "quux":
processQuux(s);
// fall-through
case "foo":
case "bar":
processFooOrBar(s);
break;
case "baz":
processBaz(s);
// fall-through
default:
processDefault(s);
break;
}
из вышеупомянутое предложение , чтобы помочь вам понять.
// Advanced example
{ // new scope for synthetic variables
boolean $take_default = false;
boolean $fallthrough = false;
$default_label: {
switch(s.hashCode()) { // cause NPE if s is null
case 3482567: // "quux".hashCode()
if (!s.equals("quux")) {
$take_default = true;
break $default_label;
}
processQuux(s);
$fallthrough = true;
case 101574: // "foo".hashCode()
if (!$fallthrough && !s.equals("foo")) {
$take_default = true;
break $default_label;
}
$fallthrough = true;
case 97299: // "bar".hashCode()
if (!$fallthrough && !s.equals("bar")) {
$take_default = true;
break $default_label;
}
processFooOrBar(s);
break;
case 97307: // "baz".hashCode()
if (!s.equals("baz")) {
$take_default = true;
break $default_label;
}
processBaz(s);
$fallthrough = true;
default:
$take_default = true;
break $default_label;
}
}
if($take_default)
processDefault(s);
}