你應該更新的 Java 知識之常用程式庫

來源:互聯網
上載者:User

標籤:

在很多人眼中,Java 已經是一門垂垂老矣的語言,但並不妨礙 Java 世界依然在前進。如果你曾離開 Java,雲遊於其它世界,或是每日只在遺留代碼中掙紮,或許是時候抬起頭,看看老 Java 中的新東西。

Guava

Guava[gwɑ:v?],一句話,只要你做Java項目,就應該用Guava(Github)。官方 API。

guava 是 Google 出品的一套 Java 核心庫,在我看來,它甚至應該是 JDK 的一部分。作為一個 Java 程式員,如果你沒抱怨過JDK的設計,只能說明一點,你寫得程式還是太少。正是JDK設計不彰,才有了一些項目來補充JDK的不足。如果說老Java程式員應該聽說過 Apache Commons Lang,那新Java程式員該知道的就是Guava了。

老 Java 程式員更多的是知道 Google Collections,不妨到它的首頁上走一遭,你會看到這個庫已經改名為 Guava。事實上,Guava 並不直接等於 Google Collections,Guava 是一個超集。Guava 實在太強大了,要想展現它的強大,需要專門的介紹,這裡就不展開了。

下面以一個統計單詞出現個數的小程式作為這個段落的結尾,雖然無法與許多其它語言的實現相提並論,但作為一個Java程式員,你不妨想一下按照傳統方式,這段代碼應該是什麼樣子。

String content = Files.toString(new File(args[0]), Charset.defaultCharset());
 
Iterable texts = Splitter.on(CharMatcher.WHITESPACE)
                                               .omitEmptyStrings()
                                               .trimResults()
                                               .split(content);
Multiset collection = HashMultiset.create(texts);

此外,Guava 還提供:

  • 緩衝(caching),本機快取實現,支援多種緩衝到期策略);
  • 原生類型(primitives) ,擴充 JDK 未提供的原生類型(如int、char)操作, 包括某些類型的無符號形式;
  • 並發庫(concurrency libraries),強大而簡單的抽象,使編寫正確的並發代碼更簡單;
  • 通用註解(common annotations)、
  • 字串處理(string processing),字串工具,包括分割、串連、填充等操作;
  • 事件匯流排(EventBus),“發布-訂閱模式”的組件通訊,不需要顯式註冊到其他組件中;
  • I/O,簡化I/O尤其是I/O流和檔案的操作,針對Java5和6版本;
  • 反射(Reflection),Guava 的 Java 反射機制工具類;
  • 散列(Hash),提供比 Object.hashCode()更複雜的散列實現,並提供布魯姆過濾器的實現。
Joda Time

你覺得一個 API 設計得差到什麼份上,才會把自己差不多的 API 全部 Deprecated 掉。java.util.Date 便是這樣的奇葩。因為它的 API 幾乎都是反直覺的,幾乎所有敢於用它的 Java 程式員都吃過它的虧。想初始化個 2013 年的第一天,還真不那麼容易:

Date firstDayOf2013 = new Date(113, 0, 1);

如果你是個 Java 新手,你能猜出 113 是從哪來的嗎?(好吧,它是 2013-1900,至於為什麼是 1900,這真得問 API 的設計者了)。

Joda Time 就是人們實在無法忍受這樣東西的產物。同樣的代碼用 Joda Time 實現:

DateTime firstDayOf2013 = new DateTime().withDate(2013, 1, 1);

無論如何,你知道這能看出這些參數的含義了。不只如此,你還可以計算兩天后是什麼日子:

firstDate.plusDays(2);

日期格式化,也是 JDK Date 系列 API 裡一大特色,你必須把代碼寫成下面這樣:

new SimpleDateFormat("yyyy.MM.dd").format(firstDayOf2013)

作為一個初始化很慢的建構函式,你還必須每次調用,因為它不是安全執行緒的。同樣的代碼,在 Joda Time 裡,我們可以用 DateTimeFormatter:

DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy.MM.dd");
...
formatter.print(dateTime);

請儘管放心大膽把 formatter 聲明成一個欄位,因為它是安全執行緒的。

當然,Joda Time 的強大遠不止於此。當然,JDK 也並不是那麼完全的自暴自棄,於是,有了一個 JSR 310 專門設計新的 Date API。JSR 310 的 spec lead 是Steven Colebourne,此人正是 Joda Time 的作者。不過,雖然 JSR 310 為我們描繪了 Date 的全新景象,但 Java 8 出來之前就先別打它的主意了,乖乖地用 Joda Time 吧,下載 Joda Time(IBM,SourceForge)。

關於 Joda Time 更多資料,查看 Joda-Time 簡介。

 

 

 

 

 

 

Hamcrest

一句話,如果你寫單元測試,就應該用 Hamcrest。

如今不寫單元測試,你都不好意思說自己在做工程項目了。但你一般這麼寫斷言呢?如果你還寫成下面這樣,我只能說你落伍了:

assertEquals(a, b);

請告訴我,哪個是執行結果,哪個是預期結果,不管你是怎樣,反正大多數情況下,我是記不住的。所以,這個在只重功能,不重可讀性年代產生的 API 該更新了。於是,Hamcrest 就是為瞭解決這樣的問題而生的。

assertThat(a, is(b));

很明顯,前面一個是執行結果,後面一個是預期結果,當然這隻是一個簡單的例子。由於 Hamcrest 引入了 matcher 的概念(就是你看到的is部分),我們可以進行更多的組合:

assertThat(number, greaterThan(5));
assertThat(text, startsWith("Hello"));
assertThat(array, hasItem("World"));

Hamcrest 如此好用,以至於 JUnit 已經將其吸納進去。如果你現在用的 JUnit 是 4.4 之後的版本,那你已經有了 Hamcrest。無需額外的配置,就可以拿過來用。

Mockito

寫單元測試不用 Mock 架構幾乎是一件不可能的事,我是說 Mock 架構,不是 Mock 模式哦!對於老 Java 程式員來說,提起 Mock 架構,率先在腦海中撞線的多半是 JMock或EasyMock。

使用 Mockito,只要有一個理由就夠了,簡單。相比於JMock,它不用寫 checking,相比於EasyMock,它省去了replay。下面是個例子:

List mockedList = mock(List.class);
when(mockedList.get(0)).thenReturn("first");
System.out.println(mockedList.get(0));

當然,Mockito還是非常強大的。

最後再強調一遍,無論使用哪個架構,請盡量不要使用verify,也就是傳說中的Mock模式,那是把代碼拉入泥潭的開始。

SLF4J 和 Logback

日誌幾乎是稍微有點規模的項目躲不開的一個東西,如果你是個老Java程式員,你必然知道 Log4J,多半也知道 Commons Logging。是時候把它們扔掉了,因為有 SLF4J 和Logback 了。SLF4J 要替代 Commons Logging,而 Logback 的目標是 Log4J。

程式員裡憤青多,SLF4J 和 Logback 的作者就是一個,他叫 Ceki Gülcü,事實上,他也是 Log4J 的作者。Log4J 的開發狀態實在讓他太不爽了,於是,他另起爐灶,打造出新的替代品。

只憑一點就足以讓我們對 SLF4J 義無反顧了,你還記得用 Commons Logging 寫出這樣的代碼嗎?

if (logger.debugEnable()) {
  logger.debug("Hello, ", name);
}

而 SLF4J 的寫法只有一句話:

logger.debug("Hello, {}", name);

從根源來說,這是時代造成的,Commons Logging 是 Java 5 之前產生的,那時候還沒有變參,所以,我們不得不說,它老了。

至於 Logback,效能是最重要的噱頭,當然,還有一些其它的理由。理由裡有一點並未提及,但對於開發人員很貼心的改進,就是記錄模式的改進,還記得 Log4J 那密碼一樣的記錄模式嗎?

%d{dd MMM yyyy HH:mm:ss} [%t] %-5p %m%n

下面是 Logback 的版本,不用查文檔,我也看出每段表示的都是什麼:

%d{dd MMM yyyy HH:mm:ss} [%thread] %-5level %msg%n

這裡介紹的幾個程式庫都是很通用的,無論是你做怎樣的開發,應該都或多或少給你一些協助。時間未曾停步,Java 開發也未曾停留,如果你是個老Java程式員,是時候更新一下自己的知識了。

你應該更新的 Java 知識之常用程式庫

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.