国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

你應(yīng)該更新的 Java 知識(shí)之常用程序庫【轉(zhuǎn)載】

2019-11-15 00:45:58
字體:
供稿:網(wǎng)友
你應(yīng)該更新的 java 知識(shí)之常用程序庫【轉(zhuǎn)載】

在很多人眼中,Java 已經(jīng)是一門垂垂老矣的語言,但并不妨礙 Java 世界依然在前進(jìn)。如果你曾離開 Java,云游于其它世界,或是每日只在遺留代碼中掙扎,或許是時(shí)候抬起頭,看看老 Java 中的新東西。

Guava

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

guava 是 Google 出品的一套 Java 核心庫,在我看來,它甚至應(yīng)該是 JDK 的一部分。作為一個(gè) Java 程序員,如果你沒抱怨過JDK的設(shè)計(jì),只能說明一點(diǎn),你寫得程序還是太少。正是JDK設(shè)計(jì)不彰,才有了一些項(xiàng)目來補(bǔ)充JDK的不足。如果說老Java程序員應(yīng)該聽說過 Apache Commons Lang,那新Java程序員該知道的就是Guava了。

老 Java 程序員更多的是知道 Google Collections,不妨到它的主頁上走一遭,你會(huì)看到這個(gè)庫已經(jīng)改名為 Guava。事實(shí)上,Guava 并不直接等于 Google Collections,Guava 是一個(gè)超集。Guava 實(shí)在太強(qiáng)大了,要想展現(xiàn)它的強(qiáng)大,需要專門的介紹,這里就不展開了。

下面以一個(gè)統(tǒng)計(jì)單詞出現(xiàn)個(gè)數(shù)的小程序作為這個(gè)段落的結(jié)尾,雖然無法與許多其它語言的實(shí)現(xiàn)相提并論,但作為一個(gè)Java程序員,你不妨想一下按照傳統(tǒng)方式,這段代碼應(yīng)該是什么樣子。

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),本地緩存實(shí)現(xiàn),支持多種緩存過期策略);
  • 原生類型(PRimitives) ,擴(kuò)展 JDK 未提供的原生類型(如int、char)操作, 包括某些類型的無符號(hào)形式;
  • 并發(fā)庫(concurrency libraries),強(qiáng)大而簡單的抽象,使編寫正確的并發(fā)代碼更簡單;
  • 通用注解(common annotations)、
  • 字符串處理(string processing),字符串工具,包括分割、連接、填充等操作;
  • 事件總線(EventBus),“發(fā)布-訂閱模式”的組件通信,不需要顯式注冊(cè)到其他組件中;
  • I/O,簡化I/O尤其是I/O流和文件的操作,針對(duì)Java5和6版本;
  • 反射(Reflection),Guava 的 Java 反射機(jī)制工具類;
  • 散列(Hash),提供比 Object.hashCode()更復(fù)雜的散列實(shí)現(xiàn),并提供布魯姆過濾器的實(shí)現(xiàn)。
Joda Time

你覺得一個(gè) API 設(shè)計(jì)得差到什么份上,才會(huì)把自己差不多的 API 全部 Deprecated 掉。java.util.Date 便是這樣的奇葩。因?yàn)樗?API 幾乎都是反直覺的,幾乎所有敢于用它的 Java 程序員都吃過它的虧。想初始化個(gè) 2013 年的第一天,還真不那么容易:

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

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

Joda Time 就是人們實(shí)在無法忍受這樣?xùn)|西的產(chǎn)物。同樣的代碼用 Joda Time 實(shí)現(xiàn):

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

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

firstDate.plusDays(2);

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

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

作為一個(gè)初始化很慢的構(gòu)造函數(shù),你還必須每次調(diào)用,因?yàn)樗皇蔷€程安全的。同樣的代碼,在 Joda Time 里,我們可以用 DateTimeFormatter:

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

請(qǐng)盡管放心大膽把 formatter 聲明成一個(gè)字段,因?yàn)樗蔷€程安全的。

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

關(guān)于 Joda Time 更多資料,查看 Joda-Time 簡介。

Hamcrest

一句話,如果你寫單元測(cè)試,就應(yīng)該用 Hamcrest。

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

assertEquals(a, b);

請(qǐng)告訴我,哪個(gè)是執(zhí)行結(jié)果,哪個(gè)是預(yù)期結(jié)果,不管你是怎樣,反正大多數(shù)情況下,我是記不住的。所以,這個(gè)在只重功能,不重可讀性年代產(chǎn)生的 API 該更新了。于是,Hamcrest 就是為了解決這樣的問題而生的。

assertThat(a, is(b));

很明顯,前面一個(gè)是執(zhí)行結(jié)果,后面一個(gè)是預(yù)期結(jié)果,當(dāng)然這只是一個(gè)簡單的例子。由于 Hamcrest 引入了 matcher 的概念(就是你看到的is部分),我們可以進(jìn)行更多的組合:

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

Hamcrest 如此好用,以至于 JUnit 已經(jīng)將其吸納進(jìn)去。如果你現(xiàn)在用的 JUnit 是 4.4 之后的版本,那你已經(jīng)有了 Hamcrest。無需額外的配置,就可以拿過來用。

Mockito

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

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

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

當(dāng)然,Mockito還是非常強(qiáng)大的。

最后再強(qiáng)調(diào)一遍,無論使用哪個(gè)框架,請(qǐng)盡量不要使用verify,也就是傳說中的Mock模式,那是把代碼拉入泥潭的開始。

SLF4J 和 Logback

日志幾乎是稍微有點(diǎn)規(guī)模的項(xiàng)目躲不開的一個(gè)東西,如果你是個(gè)老Java程序員,你必然知道 Log4J,多半也知道 Commons Logging。是時(shí)候把它們?nèi)拥袅耍驗(yàn)橛?SLF4J 和Logback 了。SLF4J 要替代 Commons Logging,而 Logback 的目標(biāo)是 Log4J。

程序員里憤青多,SLF4J 和 Logback 的作者就是一個(gè),他叫 Ceki Gülcü,事實(shí)上,他也是 Log4J 的作者。Log4J 的開發(fā)狀態(tài)實(shí)在讓他太不爽了,于是,他另起爐灶,打造出新的替代品。

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

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

而 SLF4J 的寫法只有一句話:

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

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

至于 Logback,性能是最重要的噱頭,當(dāng)然,還有一些其它的理由。理由里有一點(diǎn)并未提及,但對(duì)于開發(fā)人員很貼心的改進(jìn),就是日志模式的改進(jìn),還記得 Log4J 那密碼一樣的日志模式嗎?

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

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

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

這里介紹的幾個(gè)程序庫都是很通用的,無論是你做怎樣的開發(fā),應(yīng)該都或多或少給你一些幫助。時(shí)間未曾停步,Java 開發(fā)也未曾停留,如果你是個(gè)老Java程序員,是時(shí)候更新一下自己的知識(shí)了。


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 浏阳市| 张家川| 修水县| 任丘市| 沙坪坝区| 从化市| 新龙县| 昭觉县| 龙里县| 得荣县| 合水县| 双柏县| 潼南县| 齐齐哈尔市| 南雄市| 天水市| 绥德县| 淮北市| 淮安市| 文水县| 礼泉县| 富锦市| 沅江市| 长武县| 富平县| 正宁县| 秀山| 长子县| 宿迁市| 龙南县| 华安县| 博兴县| 夏邑县| 保德县| 巴里| 呼玛县| 林州市| 兴和县| 阳新县| 扶沟县| 乐清市|