0

假设我有以下代码块:

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入同步块。)

4

3 回答 3

2

简单地说……不。作用域变量仅在它们声明的作用域中可用。这就是他们的全部意义所在。Java 语言规范的第 14.4.2 节对此进行了描述:

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

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

于 2013-02-10T02:06:13.780 回答
0

很不幸的是,不行。当您越来越多地使用该语言时,它看起来会更好/正常。

于 2013-02-10T02:08:45.147 回答
0

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

{
    int    version;
    String content;
    synchronized (foo) {
        version = foo.getVersion();
        content = foo.getContent();
    }
    // Do something with version and content
}
于 2013-03-28T13:29:41.380 回答