Se si intende "più efficiente" da "il migliore", leggere in anticipo.
Sto suggerendo di utilizzare il seguente metodo se c'è davvero molto.
stringa in Switch è in realtà qualcosa sarà in Java 7. (Come parte della Project Coin)
E secondo il proposal, questo è il modo in cui il linguaggio Java intende recepirlo.
Prima viene calcolato il valore di hash di ognuna delle stringhe. Questo problema è quindi un problema di "switch int", che è disponibile nella maggior parte della lingua corrente ed è efficiente. In ciascuna delle case statement, si controlla se questa è realmente la stringa (in casi molto rari stringhe diverse potrebbero essere hash per lo stesso int).
Io personalmente non faccio l'ultimo passaggio in pratica a volte poiché la necessità dipende dalla situazione in cui si trova il programma specifico, cioè se le stringhe possibili sono sotto il controllo del programmatore e quanto deve essere robusto il programma.
Una pseudo campione gli corrisponde
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;
}
da the fore-mentioned proposal per aiutarvi a capire.
// 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);
}
Sì, basta usare una mappa da stringa a funzione. – Ben
@Ben potresti pubblicare un esempio come risposta? –