2013-02-10 50 views
0

比方说,我有下面的代码块:扩大变量范围超出了花括号中的Java

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

回答

2

简而言之...没有。作用域变量仅在它们声明的范围内可用。这就是他们的全部观点。这是在Java Language Specification的部分14.4.2中所述:

局部变量声明的块中的范围(§14.2)是 其余在其中出现的声明,以开始其自己的 块的初始值设定项(第14.4节),并在局部变量声明语句中包含 右侧的任何其他声明。

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

+0

而且有没有办法增加一个定义的变量的范围与一些修改器,对吗? – 2013-02-10 02:10:42

+0

@MarkusA。 - 不,没有修饰符可以将变量暴露在声明范围之外。 – Perception 2013-02-10 02:16:25

0

不幸的是,没有。随着你越来越多地使用这种语言,这只是一种看起来更好/更正常的方式。

0

如果您希望这些变量不能从其他作用域访问,则可以在另一个作用域中同时定义变量和同步块。 这样的事:

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