2010-08-27 6 views
6

¿Por qué las diferentes cajas no son automáticamente en su propio ámbito? Por ejemplo, si tuviera que hacer esto:¿Por qué los diferentes cuerpos de condición de caso no tienen un alcance diferente?

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; 
} 

el compilador se queja de redefiniciones de variables locales. Entiendo que podría hacer esto:

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; 
    } 
} 

colocar un bloqueo alrededor de cada conjunto de sentencias que se ejecutan a poner cada account variable en su propio ámbito. Pero, ¿por qué el lenguaje no hace esto por mí?

¿Por qué querrías alguna vez declarar una variable local en el cuerpo de CONDITION_ONE y luego usarla en CONDITION_TWO? Esto parece una idea TERRIBLE que debe ser explícitamente prohibida, no implícitamente permitida.

+8

** Porque [he] (http: //en.wikipedia.org/wiki/James_Gosling "James Gosling") lo dijo !! ** * (Mi nueva respuesta favorita) * – jjnguy

+1

Esa es una maldita buena pregunta; Me encontré exactamente con la misma frustración ayer. –

+1

Más contundente: ¿Por qué querrías declarar una variable local en un conmutador? Úselos con moderación; ¡poner la lógica de control en un caso es una receta para un programa confuso! –

Respuesta

5

Eso sería inconsistente con el resto del lenguaje.

Como lo es, el alcance es siempre determinado por bloques. Ese tipo de consistencia hace que Java sea más fácil de leer y mantener.

4

Porque así es como funciona C y Java fue diseñado para atraer a los programadores C.

+0

Entonces, ¿por qué C funciona de esa manera? ;] –

+2

Porque la gente de Unix en Bell Labs necesitaba un ensamblador portátil, y la sentencia de conmutación sin bloques se correlacionaba muy bien con la salida del código de máquina objetivo. –

6

¿Por qué querrías querer esto? Si necesita un nuevo alcance para cada bloque de casos, está haciendo demasiado en su bloque de casos. Empuja eso a un método.

+1

Muy de acuerdo, e incluso si * lo hizo * desea hacer demasiado en un bloque de casos, aún no necesitaría ámbitos distintos. Recuerde que toda la razón por la que se inventó el alcance fue tan "cuenta" en un bloque que es diferente de "cuenta" en el otro, lo cual no es una preocupación cuando los ámbitos nunca se superponen. –

1

suficiente suerte para usted, usted está en una buena compañía en que no le gustaba este comportamiento - Jon Skeet agrees with you :)

Sí, sé que el enlace es a una pregunta sobre C, pero este comportamiento se hereda de Java C de reglas para determinar el alcance del bloque

2

Para agregar a las otras respuestas, también se perderían los beneficios de Fallthrough si un caso posterior necesita estar en el mismo ámbito que el anterior. Por lo que yo sé, es mucho más fácil agregar un nuevo nivel de alcance que intentar escapar de uno impuesto por el lenguaje.

2

Estoy feliz de que sea exactamente así. El alcance de un local variable is always a block. Una sola regla, sin excepciones.

una cuadra de ellos descarta todo, a una cuadra de encontrarlos,
una cuadra para atraerlos a todos y atarlos en las tinieblas les

+0

En realidad, prefiero que los enlazadores sean _ligero_. –

0

Porque, es posible que desee hacer esto:

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

, y con esto ... si tiene "CONDITION_ONE", se establecerá la variable, y se llamarán DoStuffHere y DoMoreStuffHere. Pero, si de lo contrario obtuvieras CONDITION_THREE, entonces solo se llamaría a DoMoreStuffHere.

+2

¿Cómo es eso exactamente relevante para el alcance? –

+0

Bueno, podría usar la "cuenta" en cualquiera de los "casos". – Tejo

0

La respuesta es como otros han dicho, más o menos, porque así es como funcionan las cosas.

Tal vez Tom Tresansky realmente quiso decir cómo lograr el efecto deseado.

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; } 
} 
Cuestiones relacionadas