-1

Java ソース コードを読んでいるときに、2 つの小さな質問に遭遇します。Sun がこのようなコードを書く理由がわかりません。ここに質問があります (JDK バージョン:1.6):

質問1:

java.util.concurrent.PriorityBlockingQueue#offer(E e):


public boolean offer(E e) {
    final ReentrantLock lock = this.lock;
    lock.lock();
    try {
        boolean ok = q.offer(e);
        assert ok;
        notEmpty.signal();
        return true;
    } finally {
        lock.unlock();
    }
}

メソッドブロックでローカル最終ReentrantLock変数を定義するのはなぜですか?グローバル変数を直接使用しないのはなぜlockですか?

質問2:

このメソッドはオブジェクトjava.text.NumberFormat#getInstance(Locale desiredLocale, int choice):を作成しDecimalFormatますが、戻り値の型はNumberFormatです。戻り値の型を as にしないのはなぜDecimalFormatですか?

4

2 に答える 2

3

最初の質問へ:

  1. これはグローバル変数ではなく、メンバー変数です。語彙をよりよく理解するために、スコープ規則を調べることをお勧めします。
  2. プログラマーがこの決定を下す理由には、いくつかの可能性があります。すぐに、ローカル スコープの変数を使用するとパフォーマンスがわずかに向上する Android SDK を思い出します。またfinal、この場合は を使用する方がよいとプログラマが感じた可能性もあります (その理由については、こちらを参照してください)。

2 番目の質問に:

DecimalFormatほとんどの場合は を返しますが、メソッドが の別の子孫を返す可能性があります (ソースはこちらで確認できます) 。getInstanceNumberFormat

于 2013-01-05T06:24:14.923 に答える
1
  1. 変更することを意図していないローカルスコープの変数。
  2. NumberFormatは抽象クラスであるため、インターフェイスのように扱われます。
于 2013-01-05T08:50:02.433 に答える