代码之家  ›  专栏  ›  技术社区  ›  Tom Tresansky

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

  •  6
  • Tom Tresansky  · 技术社区  · 14 年前

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

    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: {
        // account var not needed here
      }
      case CONDITION_THREE: {
        // account var not needed here
      }
      case CONDITION_FOUR: {
        int account = 90384;
      }
    }
    

    在要执行的每一组语句周围放置一个块,以便 account 变量在其自身范围内。但语言为什么不为我做这些呢?

    为什么要在 CONDITION_ONE 然后用在 CONDITION_TWO 是吗?这似乎是一个可怕的想法,应该明确禁止,而不是含蓄允许。

    8 回复  |  直到 14 年前
        1
  •  5
  •   erickson    14 年前

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

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

        2
  •  6
  •   Randolpho    14 年前

    你为什么要 希望 这个?如果您需要为每个case块设置一个新的作用域,那么在case块中就做得太多了。把它推到一个方法上。

        3
  •  4
  •   Thorbjørn Ravn Andersen    14 年前

    因为C是这样工作的,Java被设计用来吸引C程序员。

        4
  •  2
  •   Dana Leonard    14 年前

    要添加到其他答案中,如果后续案例需要与前一个案例处于相同的范围内,您还将失去Fallthrough的好处。据我所知,添加一个新的范围级别要比试图摆脱语言对您的强迫要容易得多。

        5
  •  2
  •   jjnguy Julien Chastang    14 年前

    我很高兴事情就是这样。A的范围 local variable is always a block . 一条规则,没有例外。

    一个街区可以统治所有人,一个街区可以找到他们,
    在黑暗中,用一块石头把他们都捆起来。

        6
  •  1
  •   Community CDub    7 年前

    幸运的是,你在一个很好的公司里不喜欢这种行为。- Jon Skeet agrees with you :)

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

        7
  •  0
  •   Tejo    14 年前

    因为,您可能想这样做:

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

    然后,用这个……如果得到“条件一”,那么将设置变量,并同时调用dossostufhere和domorestufhere。但是,如果不是这样的话,你会得到第三个条件,那么,只有domorestufhere会被称为。

        8
  •  0
  •   emory    14 年前

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

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

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