【问题标题】:Expanding variable scope beyond curly braces in Java在 Java 中将变量范围扩展到大括号之外
【发布时间】:2013-01-25 11:28:23
【问题描述】:

假设我有以下代码块:

int    version;
String content;
synchronized (foo) {
    version = foo.getVersion();
    content = foo.getContent();
}
// Do something with version and content

其目的是获取某个对象 foo 的版本和内容的线程安全一致视图。

有没有办法写得更简洁,看起来更像这样?

synchronized (foo) {
    int    version = foo.getVersion();
    String content = foo.getContent();
}
// Do something with version and content

问题在于,在这个版本中,变量是在(同步的)花括号范围内定义的,因此不能在块外访问。所以,问题是:有没有办法将这些花括号标记为不定义新的范围块或将变量标记为属于父范围而不必在那里声明它们?

(注意:我不想简单地将// Do something with version and content 拉到同步块中。)

【问题讨论】:

    标签: java scope curly-braces


    【解决方案1】:

    简单地说……不。作用域变量仅在它们声明的作用域中可用。这就是他们的全部意义所在。这在Java Language Specification 的第 14.4.2 节中有描述:

    块中局部变量声明的范围(第 14.2 节)是 声明出现的块的其余部分,从它的开始 自己的初始化程序(第 14.4 节)并包括任何进一步的声明符 就在局部变量声明语句中。

    您的变量需要在它们要使用的范围内声明(或更高,但绝对不能更低)。

    【讨论】:

    • 而且也没有办法通过一些修饰符来增加已定义变量的范围,对吧?
    • @MarkusA。 - 不,没有任何修饰符可以将变量“暴露”在声明的范围之外。
    【解决方案2】:

    很遗憾,没有。它只是随着您越来越多地使用该语言而看起来更好/正常的东西。

    【讨论】:

      【解决方案3】:

      如果您希望这些变量不能从其他范围访问,您可以在另一个范围中定义变量和同步块。 像这样的:

      {
          int    version;
          String content;
          synchronized (foo) {
              version = foo.getVersion();
              content = foo.getContent();
          }
          // Do something with version and content
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-04-12
        • 2018-09-05
        • 1970-01-01
        • 2011-06-19
        相关资源
        最近更新 更多