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 に答える