我们说我有以下代码块:
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
拉入同步块。)
答案 0 :(得分:2)
简单地说......不。范围变量仅在声明的范围内可用。这就是他们的全部观点。这在Java Language Specification:
的第14.4.2节中有所描述块(第14.2节)中局部变量声明的范围是 声明出现的块的其余部分,从其开始 拥有初始化程序(第14.4节)并包括任何进一步的声明符 在本地变量声明声明中。
您的变量需要在它们要使用的范围内声明(或更高,但绝对不低)。
答案 1 :(得分:0)
不幸的是,没有。当你越来越多地使用这种语言时,这只是看起来更好/更正常的东西。
答案 2 :(得分:0)
如果您希望无法从其他范围访问这些变量,则可以在另一个范围中定义变量和同步块。 像这样:
{
int version;
String content;
synchronized (foo) {
version = foo.getVersion();
content = foo.getContent();
}
// Do something with version and content
}