2010-08-27 3 views
6

Perché i diversi corpi dei casi non sono automaticamente nella loro portata? Ad esempio, se dovessi fare questo:Perché i diversi corpi delle condizioni del caso non sono in ambito diverso?

switch(condition) { 
    case CONDITION_ONE: 
    int account = 27373; 
    case CONDITION_TWO: 
    // account var not needed here 
    case CONDITION_THREE: 
    // account var not needed here 
    case CONDITION_FOUR: 
    int account = 90384; 
} 

il compilatore possa lamentare ridefinizioni delle variabili locali. Comprendo ho potuto fare questo:

switch(condition) { 
    case CONDITION_ONE: { 
    int account = 27373; 
    } 
    case CONDITION_TWO: { 
    // account var not needed here 
    } 
    case CONDITION_THREE: { 
    // account var not needed here 
    } 
    case CONDITION_FOUR: { 
    int account = 90384; 
    } 
} 

di mettere un blocco attorno a ciascun insieme di istruzioni da eseguire per mettere ogni variabile account nel proprio ambito. Ma perché il linguaggio non fa questo per me?

Perché dovresti voler dichiarare una variabile locale nel corpo di CONDITION_ONE e quindi utilizzarla in CONDITION_TWO? Sembra un'idea TERRIBILE che dovrebbe essere esplicitamente bandita, non implicitamente consentita.

+8

** Perché [lui] (http: //en.wikipedia.org/wiki/James_Gosling "James Gosling") ha detto così !! ** * (La mia nuova risposta preferita) * – jjnguy

+1

Questa è una domanda dannatamente buona; Ieri ho incontrato esattamente la stessa frustrazione. –

+1

Più schiettamente: perché dovresti voler dichiarare una variabile locale in un interruttore? Usali con parsimonia; mettere la logica di controllo in un caso è una ricetta per un programma confuso! –

risposta

5

Ciò sarebbe incoerente con il resto della lingua.

Allo stato attuale, lo scope è sempre determinato dai blocchi. Questo tipo di coerenza rende Java più facile da leggere e mantenere.

4

Perché è così che C funziona e Java è stato progettato per attirare i programmatori C.

+0

Allora perché C funziona in questo modo? ;] –

+2

Poiché gli utenti Unix di Bell Labs avevano bisogno di un assemblatore portatile e l'istruzione switch senza blocchi corrispondeva molto bene all'output del codice macchina target. –

6

Perché dovresti vuoi questo? Se hai bisogno di un nuovo scope per ogni blocco di case, stai facendo troppo nel tuo case block. Spingilo a un metodo.

+1

Molto d'accordo, e anche se * avessi * voluto fare troppo in un blocco di casi, non avresti ancora bisogno di ambiti separati. Ricorda che l'intero motivo per cui lo scopo è stato inventato era che "account" in un blocco è diverso da "account" nell'altro, il che non è un problema quando gli ambiti non si sovrappongono mai. –

1

abbastanza fortunato per voi, siete in buona compagnia in non gradire questo comportamento - Jon Skeet agrees with you :)

Sì, lo so il link è a una domanda su C, ma questo comportamento Java è ereditato dalla C di regole di scoping del blocco.

2

Per aggiungere alle altre risposte, si perderebbero anche i vantaggi della ricaduta nel caso in cui un caso successivo debba essere nello stesso ambito del precedente. Per quanto ne so, è molto più facile aggiungere un nuovo livello di ambito rispetto a cercare di sfuggire a chi ti impone il linguaggio.

2

Sono felice che sia esattamente così. L'ambito di un local variable is always a block. Una sola regola, senza eccezioni.

Un blocco per domarli, un isolato a trovarli,
Un blocco per portarli tutti e nel buio incatenarli

+0

In realtà preferisco che i linker siano _light_. –

0

Perché, si consiglia di fare questo:

switch(condition) { 
    case CONDITION_ONE: 
    int account = 27373; 
    case CONDITION_TWO: 
    DoStuffHere(); 
    case CONDITION_THREE: 
    case CONDITION_FOUR: 
    DoMoreStuffHere(); 
} 

quindi, e con questo ... se si ottiene "CONDITION_ONE", la variabile verrà impostata e verranno chiamati sia DoStuffHere che DoMoreStuffHere. Ma, se altrimenti hai ottenuto CONDITION_THREE, allora verrà chiamato solo DoMoreStuffHere.

+2

In che modo, esattamente, è rilevante per l'ambito? –

+0

Bene, poteva usare "l'account" in uno qualsiasi dei "casi". – Tejo

0

La risposta è come altri hanno detto - più o meno - perché è così che funzionano le cose.

Forse Tom Tresansky voleva dire davvero come ottenere l'effetto desiderato.

switch(condition) { 
    case CONDITION_ONE: 
    { int account = 27373; } 
    case CONDITION_TWO: 
    // account var not needed here 
    case CONDITION_THREE: 
    // account var not needed here 
    case CONDITION_FOUR: 
    { int account = 90384; } 
} 
Problemi correlati