2013-01-05 41 views
-1

我正在閱讀Java源代碼,遇到兩個小問題。我不知道爲什麼Sun這樣寫代碼,這裏有問題(JDK版本:1.6):關於硬性理解的兩個問題Java代碼

問題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

+9

您可能要將此分成2個完全不同的問題,因爲他們是不相關的 – DWright

+0

@DWright:是的,我將在未來做到這一點,謝謝你的建議 – hiway

+0

的API是它是什麼。除非你能抓住寫它的人,否則爲什麼沒有意義。 #1似乎完全沒有意義,除非它涉及內存模型規則。重新編號2,請注意,所有'getInstance()'方法都返回'NumberFormat',而不僅僅是那個。 – EJP

回答

3

關於第一個問題:

  1. 這不是一個全局變量,這是一個成員變量。我建議你研究範圍規則以更好地理解詞彙。
  2. 程序員爲什麼會做出這個決定有幾種可能性。大多數情況下,我會想到Android SDK,在使用本地作用域變量時性能會有所增加。這也可能是程序員認爲在這種情況下使用final將是更好的選擇(更多關於爲什麼可能發生here)。

對第二個問題:

它返回一個DecimalFormat大部分的時間,但它是可能的(你可以看到the source here)爲getInstance方法返回的NumberFormat不同的後代。

+0

第一點:我錯了,它是一個成員變量,謝謝。到你的第二點:成員變量'lock'已經被定義爲final:private final ReentrantLock lock = new ReentrantLock(true);我認爲作者在方法塊中定義一個局部範圍的變量只是做了一個不必要的動作。 – hiway

1
  1. 本地範圍變量不打算修改。
  2. NumberFormat是一個抽象類,所以它被視爲接口。