【问题标题】:Two questions about hard understanding Java code [closed]关于难以理解 Java 代码的两个问题 [关闭]
【发布时间】:2013-01-05 06:15:45
【问题描述】:

我在看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();
    }
}

为什么要在方法块中定义一个局部final ReentrantLock变量,为什么不直接使用全局变量lock

问题 2:

此方法java.text.NumberFormat#getInstance(Locale desiredLocale, int choice): 创建一个DecimalFormat 对象,但返回类型为NumberFormat。为什么不将返回类型设为DecimalFormat

【问题讨论】:

  • 你可能想把它分成两个完全独立的问题,因为它们是不相关的
  • @DWright:是的,我以后会做这个,谢谢你的推荐
  • API 就是这样。除非你能找到写它的人,否则问为什么是毫无意义的。 #1 对我来说似乎完全没有意义,除非它与内存模型规则有关。关于 #2,请注意所有 getInstance() 方法都返回 NumberFormat, 而不仅仅是那个。

标签: java number-formatting jdk1.6 blockingqueue


【解决方案1】:

第一个问题:

  1. 那不是全局变量,那是成员变量。我确实建议您查看范围规则以更好地了解词汇表。
  2. 程序员做出此决定的原因有多种。最直接地,我想起了 Android SDK,当您使用本地范围的变量时,性能会有轻微的提升。也可能是程序员认为在这种情况下使用final 会是一个更好的选择(更多关于为什么这可能会发生here。)。

关于第二个问题:

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

【讨论】:

  • 到你的第一点:我错了,它是一个成员变量,谢谢。第二点:成员变量'lock'已经定义为final:private final ReentrantLock lock = new ReentrantLock(true);我认为作者在方法块中定义一个局部范围的变量只是做了一个不必要的举动。
【解决方案2】:
  1. 不打算修改的局部范围变量。
  2. NumberFormat 是一个抽象类,所以它被视为接口。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-04
    • 1970-01-01
    • 2011-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多