Расширение области действия переменной за фигурные скобки в 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 в синхронизированный блок.)


person Markus A.    schedule 10.02.2013    source источник


Ответы (3)


Проще говоря... нет. Переменные с областью действия доступны только в той области, в которой они объявлены. В этом весь их смысл. Это описано в разделе 14.4.2 документа Спецификация языка Java:

Областью действия объявления локальной переменной в блоке (§14.2) является остальная часть блока, в котором появляется объявление, начиная с его собственного инициализатора (§14.4) и включая все дальнейшие деклараторы справа в операторе объявления локальной переменной.

Ваши переменные должны быть объявлены в той области видимости, в которой они будут использоваться (или выше, но точно не ниже).

person Perception    schedule 10.02.2013
comment
И нет никакого способа увеличить область действия определенной переменной с помощью какого-либо модификатора, верно? - person Markus A.; 10.02.2013
comment
@МаркусА. - нет, нет модификатора, который "выставит" переменную за пределы области видимости, в которой она была объявлена. - person Perception; 10.02.2013

К сожалению нет. Это просто то, что выглядит лучше/нормальнее по мере того, как вы используете язык все больше и больше.

person Tips48    schedule 10.02.2013

Если вы хотите, чтобы эти переменные не были доступны из другой области, вы можете определить как переменные, так и синхронизированный блок в другой области. Что-то вроде этого:

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