关于难以理解Java代码的两个问题

时间:2013-01-05 06:15:46

标签: java number-formatting jdk1.6 blockingqueue

我正在阅读Java源代码,遇到两个小问题。我不知道为什么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。为什么不将返回类型设为DecimalFormat

2 个答案:

答案 0 :(得分:3)

对第一个问题:

  1. 这不是一个全局变量,它是一个成员变量。我建议您查看范围规则以更好地了解词汇。
  2. 程序员为什么要做出这个决定有几种可能性。最让我想起的是Android SDK,当您使用本地范围的变量时,性能会有轻微的提升。也可能是程序员觉得在这个实例中使用final会是更好的选择(更多关于为什么可能会发生here。)。
  3. 第二个问题:

    大部分时间都会返回DecimalFormat,但getInstance方法有可能(并且您可以看到the source here)返回NumberFormat的不同后代

答案 1 :(得分:1)

  1. 无意修改的本地范围变量。
  2. NumberFormat是一个抽象类,所以它被视为接口。