J2SE1.5便於開發的新語言特性:Joshua Bloch的訪談錄(3)

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />您能把泛型和"for增強"結合在一起嗎?

 

當然沒問題。你看,我們把泛型技術融入到上面的代碼中:

 

void cancelAll(Collection<TimerTask> c) {

    for (TimerTask task : c)

        task.cancel();

}

 

我覺得這是更優雅的代碼。現在代碼可以準確地表明他要做什麼,而且提供了編譯期類型安全的保證。

 

請給我們講講自動置入(autoboxing)。

 

大家都知道,Java語言有兩種類型的變量:一種是基本類型,一種是對象的索引類型(object references)。基本類型的變量不能置入到集合中,所以如果你想把基本變量存入集合或從集合中取出的話,你不得不在基本類型(如int)和對應的包裝類(如Integer)之間轉來轉去。每個這樣做的人都會覺得這不是好的做法。

比如,我們考慮一個程序它用來統計輸入命令行中的詞的頻率。我們使用一個Map,它的關鍵字是輸入的詞,值是這個詞在命令行中出現的次數:

 

public class Freq {

    private static final Integer ONE = new Integer(1);

 

    public static void main(String args[]) {

        // Maps word (String) to frequency (Integer)

        Map m = new TreeMap();

 

        for (int i=0; i<args.length; i++) {

            Integer freq = (Integer) m.get(args[i]);

            m.put(args[i], (freq==null ? ONE :

                  new Integer(freq.intValue() + 1)));

        }

        System.out.println(m);

    }

}

 

你看看在循環中增加數量的代碼是多麼地混亂?現在我們用autoboxing、泛型和"for增強"來重寫一下這個程序:

 

public class Freq {

    public static void main(String args[]) {

       Map<String, Integer> m = new TreeMap<String, Integer>();

       for (String word : args)

           m.put(word, m.get(word) + 1);

       System.out.println(m);

    }

}

 

是不是好多了? 有一點值得注意:程序假設當你自動取出null的時候,你會得到0。是否是這種情況還是一個問題。另外一個可選擇的就是拋出一個NullPointerException 異常。這兩種選擇都有其各自的優勢。“自動取出null得到0”可以美化像上面這樣的程序,但是它也可能隱蔽了真正的錯誤。如果誰有強烈的意見或者有能令人信服的關於這個問題更好的解決方案,請與JSR-201專家組聯繫。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章