venerdì 1 febbraio 2008

Lo switch in Java

Un'altra delle cose scoperte la settimana scorsa, che all'inizio mi ha lasciato nel panico, perchè non capivo cosa stesse succedendo, è che Java a uno switch... che funziona solo su integer...
Non conosco i moivi di questa scelta implementativa... che mi pare bizzarra... in un linguaggio dove puoi fare quasi tutto, questa è una limitazione non da poco

E a volte è proprio utile, soprattutto ai fini delal leggibilità del codice, eseguire uno switch su delle stringhe

Ok, ok, la soluzione potrebbe essere una serie di If elseif... ma ve lo immaginate un codice con una decina di elseif?
Uno schifo.

Certo, si potrebbe pure fare una mappatura "caratteri-integer", ma che barba... e poi risulterebbe meno leggibile il codice

Girovagando in rete ho trovato una soluzione abbastanza buona.
In pratica, prima di eseguire lo switch, si crea una costante Enum, elencando come contenuti enumerativi le stringhe che si vogliono usae... e poi switchare su queste

Esempio, ho una variabile stringa che può assumere questi valori "carne, pesce, dolce, contorno, frutta" e voglio creare uno switch su questa variabile sringa
Si prosegue così:
  • Definire una costante enum con i valori congruenti alle stringhe che si vogliono prendere in considerazione

    enum portate {
    carne, pesce, dolce, contorno, frutta
    }


  • Successivamente eseguire uno switch con un valueof(costanteenum). Il valueof fa una comparazione tra le stringhe e i valori di enum. Si può usare toLowerCase per un confronto non case sensitive

    switch (portate.valueOf(e.getActionCommand().toLowerCase())){
    case carne:
    bla bla
    break;

    [...]

    case frutta:
    bla bla
    break;
    }

  • L'unico problema è che così si potrebbero sollevare delle eccezioni IllegalArgumentException or NullPointerException (penso che succeda se la stringa ha un valore che non ha corrispondenze nell'enum. Si possono gestire con un Try-catch

    enum portate {

    carne, pesce, dolce, contorno, frutta;

    public static portate cercaportata(String stringa)
    {
    try {
    return valueOf(strimga);
    }
    catch (Exception ex) {
    return NOVALUE;
    }
    }
    }

    switch (portate.valueOf(e.getActionCommand().toLowerCase())){
    case carne:
    bla bla
    break;

    [...]

    case frutta:
    bla bla
    break;

    default:
    bla bla per valori non presenti nell'enum
    }

Nessun commento: