Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
关于难以理解Java代码的两个问题_Java_Number Formatting_Jdk1.6_Blockingqueue - Fatal编程技术网

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

关于难以理解Java代码的两个问题,java,number-formatting,jdk1.6,blockingqueue,Java,Number Formatting,Jdk1.6,Blockingqueue,我正在阅读Java源代码,遇到两个小问题。我不知道Sun为什么要写这样的代码,以下是JDK版本1.6的问题: 问题1: 为什么要在方法块中定义局部最终ReentrantLock变量,为什么不直接使用全局变量锁 问题2: 此方法java.text.NumberFormatgetInstanceLocale desiredLocale,int choice:创建DecimalFormat对象,但返回类型为NumberFormat。为什么不将返回类型设置为DecimalFormat?对于第一个问题:

我正在阅读Java源代码,遇到两个小问题。我不知道Sun为什么要写这样的代码,以下是JDK版本1.6的问题:

问题1:

为什么要在方法块中定义局部最终ReentrantLock变量,为什么不直接使用全局变量锁

问题2:

此方法java.text.NumberFormatgetInstanceLocale desiredLocale,int choice:创建DecimalFormat对象,但返回类型为NumberFormat。为什么不将返回类型设置为DecimalFormat?

对于第一个问题:

这不是一个全局变量,而是一个成员变量。我建议你们研究一下范围规则,以便更好地了解词汇。 对于程序员为什么会做出这个决定,有几种可能性。最让我想到的是Android SDK,当您使用一个局部范围的变量时,它的性能会有轻微的提高。也可能是程序员觉得在这个例子中使用final是一个更好的选择,更多的是关于为什么会发生这种情况。。 关于第二个问题:

它大部分时间都返回DecimalFormat,但您可以看到getInstance方法返回NumberFormat的不同后代

不打算修改的局部作用域变量。 NumberFormat是一个抽象类,因此它被视为接口。
你可能想把这个问题分成两个完全不同的问题,因为它们是unrelated@DWright:是的,我以后会这样做,谢谢你的推荐API就是这样。除非你能找到写这篇文章的人,否则问为什么毫无意义。1对我来说似乎毫无意义,除非它与内存模型规则有关。注意,所有getInstance方法都返回NumberFormat,而不仅仅是那个。第二点:成员变量“lock”已定义为final:private final ReentrantLock lock=new ReentrantLocktrue;我认为作者在方法块中定义一个局部作用域变量只是做了一个不必要的动作。
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();
    }
}