Enum nelle dichiarazioni di switch java e completezza

4

Mi sento come se dovessi essere in grado di trovare una risposta a questo, ma risulta essere più difficile da cercare del previsto ... quindi:

In C #, quando facciamo qualcosa di simile:

enum MyEnumClass { A, B };

static String Test(MyEnumClass m)
{
    switch (m)
    {
        case MyEnumClass.A: return "the value was A";
        case MyEnumClass.B: return "the value was B";
        //default: return "The value was ????"; //we need to uncomment this
    }
}

otteniamo un errore "non tutti i percorsi di codice restituiscono un valore" e dobbiamo aggiungere il caso predefinito, perché le enumerazioni sono in realtà solo numeri mascherati e potremmo chiamare il metodo con un valore che non abbiamo trattato in questo modo:

test((MyEnumClass)53)

Tuttavia, non penso che possiamo fare una cosa del genere (chiamiamo il metodo con nient'altro che i nostri due valori enum) in Java (o possiamo?). Tuttavia, se scriviamo codice simile in Java, otteniamo un errore simile. Se questo è il caso, c'è qualche ragione per cui il compilatore non riesce a capire che una tale istruzione switch è completa e quindi che il caso predefinito non è necessario?

    
posta Hirle 11.03.2015 - 21:17
fonte

2 risposte

7

Immagina cosa succederebbe se decidessi che enum aveva bisogno di un nuovo valore, ma quell'enum viene usato in mille istruzioni switch proprio come quella. Poiché Java li ha obbligati tutti ad avere un caso predefinito quando hanno scritto quegli switch, quindi qualsiasi istruzione di logging o eccezione che tutti hanno scelto di mettere lì probabilmente li salverà un sacco di mal di testa quando apporterai quel cambiamento.

Se il compilatore Java accetta quelle migliaia di istruzioni switch con solo due casi perché coprono tutti i valori ... allora non puoi mai aggiungere il tuo terzo valore, perché il codice di nessuno sarebbe più compilabile. E come ha sottolineato Ddyer, la compilazione separata rende impossibile un tale controllo nel caso generale.

Quindi non ti resta che richiedere sempre un caso predefinito o non averlo mai richiesto. Dal momento che Java ha una filosofia molto diversa da C ++, ha scelto il primo.

Inoltre, Enums in Java può essere nullo , quindi devi essere preparato per questo.

    
risposta data 11.03.2015 - 21:40
fonte
1

La ragione per cui il compilatore chiederà "non tutti i percorsi di codice restituiscono un valore" è perché nota che il tuo caso non copre tutte le possibilità. Questa NON è una restrizione sul tipo di oggetto che stai usando. Se si restituisce un valore nel caso predefinito, il compilatore lo legge come un modo di gestire il caso per altri valori possibili.

Un'altra opzione è aggiungere un'istruzione return dopo l'istruzione switch.

    
risposta data 11.03.2015 - 22:48
fonte

Leggi altre domande sui tag