Java 为什么不同的案例主体不在不同的范围内?

Java 为什么不同的案例主体不在不同的范围内?,java,switch-statement,Java,Switch Statement,为什么不同的案例主体不自动在其各自的范围内?例如,如果我要这样做: 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 ac

为什么不同的案例主体不自动在其各自的范围内?例如,如果我要这样做:

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;
}
switch(condition) {
  case CONDITION_ONE:
    int account = 27373;
  case CONDITION_TWO:
    DoStuffHere();
  case CONDITION_THREE:
  case CONDITION_FOUR:
    DoMoreStuffHere();
}
编译器会抱怨局部变量的重新定义。我明白我可以做到这一点:

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;
  }
}
在要执行的每一组语句周围放置一个块,将每个
account
变量置于其自己的范围内。但是为什么语言不能为我做到这一点呢


为什么要在
条件一
的主体中声明局部变量,然后在
条件二
中使用它?这似乎是一个可怕的想法,应该明确禁止,而不是暗中允许。

因为C就是这样工作的,Java就是为了吸引C程序员而设计的。

这与语言的其他部分不一致


实际上,范围总是由块决定的。这种一致性使Java更易于阅读和维护。

为什么要这样?如果您需要为每个案例块创建一个新的范围,那么您在案例块中做的太多了。把它推到一个方法上

幸运的是,你在一家很好的公司里不喜欢这种行为——:)


是的,我知道链接指向一个关于C的问题,但这种Java行为是从C的块范围规则继承而来的。

要添加到其他答案中,如果后续案例需要与前一个案例在同一范围内,您也将失去故障排除的好处。据我所知,添加一个新的范围级别要比试图逃避语言强加给您的范围级别容易得多。

我很高兴它就是这样。a的范围。只有一条规则,没有例外

一个块来管理它们,一个块来查找它们,

用一个方块将它们全部带到一起,然后在黑暗中将它们绑定起来,因为您可能需要执行以下操作:

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;
}
switch(condition) {
  case CONDITION_ONE:
    int account = 27373;
  case CONDITION_TWO:
    DoStuffHere();
  case CONDITION_THREE:
  case CONDITION_FOUR:
    DoMoreStuffHere();
}

然后,用这个。。。如果您得到“CONDITION_ONE”,那么将设置变量,并调用dostufhere和DoMoreStuffHere。但是,如果你得到了条件3,那么只有DoMoreStuffHere会被调用。

答案正如其他人所说——或多或少——因为这就是事情的运作方式

也许汤姆·特雷桑斯基真正的意思是如何达到预期的效果

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

因为我是这么说的!!(我最喜欢的新答案)这是一个非常好的问题;我昨天遇到了完全相同的挫折。更直截了当的是:为什么要在开关中声明局部变量?节约使用;把控制逻辑放在一个盒子里是一个容易混淆的程序!因为它实际上是伪装的“goto”。高度同意,即使你确实想在一个案例块中做太多,你仍然不需要单独的作用域。记住作用域被发明的全部原因是,一个块中的
account
不同于另一个块中的
account
,当作用域从不重叠时,这一点就不重要了。因为贝尔实验室的Unix人员需要一个可移植的汇编程序,不带块的switch语句很好地映射到了它们的目标机器代码输出。实际上,我更喜欢链接器是轻量级的。这与作用域有什么关系?他可以在任何“案例”中使用“帐户”。