使用Google Collections的理由
Google Collections終于發(fā)布了1.0版,本文是JavaLobby上的一篇博文,作者講述了應(yīng)該使用Google Collections的若干理由,大家有興趣的話也可以體驗(yàn)一下。(2010.01.08最后更新)
在去年底看到Google Collections發(fā)布了它的1.0版之后,我想我應(yīng)該看看與JDK默認(rèn)提供的集合框架相比,使用Google Collections類庫會(huì)有什么好處。Google Collections的發(fā)行包是一個(gè)zip文件,包含了一個(gè)jar文件,源文件和Javadoc文件。
Java Collections API就是被用來擴(kuò)展的,而Google Collections則擴(kuò)展的很好。很快,我就發(fā)現(xiàn)該類庫最好的特性之一是它包含了MultiMap類。
為了證明這一點(diǎn),讓我們使用一個(gè)電話薄的例子,在這個(gè)例子中每個(gè)人都可一個(gè)或多個(gè)電話號(hào)碼。事先,我已將電話號(hào)碼存入每個(gè)人的一個(gè)單獨(dú)的List中,如下所示:
Map<Person, List<PhoneNumber>> phoneBook = new HashMap<Person, List<PhoneNumber>>();
使用MultiMap,將變得十分簡潔:
Multimap <Person, PhoneNumber> newPhoneBook = ArrayListMultimap.create();
且在使用MultiMap時(shí),就沒必要管理每個(gè)人的電話號(hào)碼列表了。當(dāng)我要加一個(gè)新的電話號(hào)碼時(shí),只需這么做:
Person me = new Person("James");
newPhoneBook.put(me, new PhoneNumber(111));
newPhoneBook.put(me, new PhoneNumber(201));
而不是使用以前的繁冗方法去管理ArrayList:
Person me = new Person("James");
if(phoneBook.get(me) == null)
{
phoneBook.put(me, new ArrayList<PhoneNumber>());
}
phoneBook.get(me).add(new PhoneNumber(111));
對(duì)需要處理的數(shù)據(jù)進(jìn)行管理這個(gè)話題,Precondition允許你對(duì)傳入的參數(shù)進(jìn)行校驗(yàn)。
Preconditions.checkNotNull(me);
我知道在Java中達(dá)到上述效果也可使用斷言,但上述方法可使你的校驗(yàn)總是有效。你能方便地進(jìn)行校驗(yàn),通過判定一個(gè)表達(dá)式,也可為特定的參數(shù)拋出IllegalArgumentException。
Preconditions.checkArgument((i > 0), "The value i has to be greater than zero");
還有許多其它有用的特性,例如快速創(chuàng)建不可變集合的能力:
ImmutableList<Integer> numbers = ImmutableList.of(1, 2, 3, 5, 8, 13, 21, 34);
以前,你需要?jiǎng)?chuàng)建一個(gè)普通的List,然后再調(diào)用Collections.unmodifiableList()方法。
為了對(duì)該類庫有一個(gè)很好的概覽,查看由Kevin Bourrillion在2008年給出的一段視頻。
總之,該類庫使你能以更優(yōu)雅的方法來處理集合對(duì)象,并使你的代碼更具可讀性且更扼要。