2013-02-10 52 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 
}