Update to Java 17 – TWJUG 202203 分享

前言

Hi 大家好,我是來自 LINE 台灣 EC 部門的 Hao Cheng。同時負責這次 TWJUG 社群的籌辦,感謝 LINE 讓社群的大家有機會可以在新辦公室與 TWJUG 聯合舉辦線下活動,除了能分享這次 Java Update 資訊之外,也讓現場近乎滿場的狀態,大家非常踴躍的討論也讓我印象對這次的活動印象非常深刻!當然 Java 升級版本都是切身之痛,當中的優劣就讓我分享給大家吧!

本次報名連結:TWJUG 202203 聚會 (kktix.cc)

簡報:https://speakerdeck.com/line_developers_tw/upgrade-to-java-17

內容分享

Java 17 是 Java 改成半年發布一版之後釋出的第二個 LTS 版本 (上一個是 Java 11),預計至少會支援到 2026 (Java 11 預計支援到 2024 年),Java 17 是在 2021/09 正式推出,到現在已經超過半年了,現在的 17.0.2 修了大多數比較嚴重的問題,所以推薦可以的話就升級到最新的 Java 17 吧,不但可以用從 Java 12~17 增加的新功能,GC 效能也有改善,如果需要 low latency 的話還可以採用 ZGC,號稱可以把平均 GC pause 的 latency 壓在 1ms 以下,相較於 G1GC 平均 100ms 是很大的進步,這次會介紹幾個 Java 17 主要的新功能已經升級遇到的問題,提供給大家當作參考。

Java 17 第一個主要功能是 Text Blocks,以往在 Java 裡面要處理多行的字串如果又有特殊字元 (例如 HTML),會變得非常麻煩因為需要用 \\ 來 escape 特殊字元還要用 \n 來換行,但是 Java 14 加上 Text Blocks 語法之後處理這種字串就簡單許多了,只要用三個 " 開頭加上換行就可以新增一個 Text Blocks ,在 Text Blocks 裡面大多數的換行和特殊字元都會被保留不需要特別處理,程式的可讀性會增加許多。

第二個比較重要的新功能是 record class,寫 Java 的人大多知道 Java Bean 的慣例是 getter/setter 方法加上 equals/hashcode,但是每次都要寫這麼多很麻煩,所以大多數人通常會用 IDE 自動產生,或是用 Library 幫忙處理,例如 Lombok/AutoValue 等等。

Java 16 新增的 record class 可以幫忙解決這個問題,record class 是一種特殊的 Java class,差別在於 record class 裡面定義的 field 會自動產生 getter/equals/hashcode/toString 等方法,不需要再透過 IDE 或是 library 產生方便許多。使用上要注意的一點是 record class 定位是 value class,所以 record class 本身和裡面的所有欄位都是 final 的,自然也沒有 setter 方法;

還有一點比較特別的是 record class 捨棄了 Java Bean 的 getter 方法要用 getXXX 命名的慣例,改成只要用 field 名稱就可以了。只要注意這幾點就可以放心的使用 record class 來簡化現有的程式啦。

最後分享一下我們從 Java 11 升級到 17 的過程,升級大致上都還蠻順利的,主要的框架像是 Spring/Hibernate 都在去年就支援 Java 17 了,所以先升級 Spring/Hibernate 到有支援 Java 17 的版本就可以了。

我們升級過程還有遇到兩個小問題,一個是原本程式中用的 AES/CTR/PKCS5Padding 在 Java 17 不支援了,但換成 AES/CTR/NoPadding 後,跑過所有測試發現行為跟原本的一致就解決了。

另一個問題是 MaxPermSize 設定在 Java 17 已經移除了,這個設定從 Java 8 開始就 deprecated 了,不過在 Java 17 之前的版本使用只會出現警告訊息,但在 Java 17 使用會出現錯誤,我們的 Jenkins job 有用到這個設定就無法正常執行,只要把這個設定移除就恢復正常了。

小結

希望透過這次的分享讓大家知道 Java 17 升級的好處以及一些細節內容上要如何處理,如果你周遭的大家也正在猶豫要不要升級上去,歡迎分享這篇的內容給他們,或是下次參加實體活動囉!本次的分享就到這,那我們就下次活動見啦。

現場活動分享

中場休息前由 EC 主管 Ange 帶大家快速認識一下整個部門是如何運作的,以前當中負責的服務有哪些,休息時間交流時也許多人都直接來詢問相關問題,現場交流也是非常鼓勵大家來!

LINE Pay 的同仁分享了在 Pay 裡面所擁有的服務,如果是使用 Java 作為開發的朋友大致上會參與到什麼樣類型的開發,將由這樣介紹甚至有許多人現場直接給履歷(哇),有興趣歡迎參考以下職缺連結:

如何與我們合作

想知道如何申請校園授課與分享嗎? 歡迎各個系學會與相關社團發送各位的需求到這個連絡信箱: dl_twn_devrel@linecorp.com