AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當(dāng)前位置:首頁 > 科技  > 軟件

八個從Java 11到Java17中的功能提升

來源: 責(zé)編: 時間:2023-09-25 10:39:23 296觀看
導(dǎo)讀一、為什么要從Java 11遷移?盡管Java 11是一個長期支持版本,且被廣泛應(yīng)用于許多應(yīng)用程序中,但這里有些重要的理由需要考慮遷移到Java 17:8對Java 11的支持將結(jié)束:Java 11的官方支持將持續(xù)到2023年9月,并提供擴展支持直至202

一、為什么要從Java 11遷移?

盡管Java 11是一個長期支持版本,且被廣泛應(yīng)用于許多應(yīng)用程序中,但這里有些重要的理由需要考慮遷移到Java 17:8kYd28資訊網(wǎng)——每日最新資訊28at.com

  • 對Java 11的支持將結(jié)束:Java 11的官方支持將持續(xù)到2023年9月,并提供擴展支持直至2026年9月。這意味著在支持結(jié)束后,我們將不能再獲得任何補丁(甚至是安全補丁)。
  • Spring 6:最新的Spring版本Spring 6需要Java 17才能正常運行,而且許多與Spring配套使用的庫也將遷移到Java 17。如果你的應(yīng)用程序依賴于Spring框架,那么應(yīng)該考慮遷移到Java 17。
  • Java 17提供免費的Oracle JDK:Java 17采用了新的NFTC(Oracle免費條款和條件)許可證,可以在生產(chǎn)環(huán)境和商業(yè)用途中免費使用Oracle JDK。相比之下,Java 11不允許在這些情況下免費使用Oracle JDK。

kYd28資訊網(wǎng)——每日最新資訊28at.com

二、Java 17有什么新功能?

Java 17引入了一些改進和新功能,這些功能將得到長期支持。kYd28資訊網(wǎng)——每日最新資訊28at.com

1. 文本塊

Java引入了文本塊功能,這使代碼更易讀,并避免了不必要的字符串格式化操作。現(xiàn)在,我們可以將文本放在三引號之間,并在其中包含多個雙引號字符串,而無需使用轉(zhuǎn)義字符。下面是一個示例:kYd28資訊網(wǎng)——每日最新資訊28at.com

private static void jsonBlock() {    String text = """            {              "name": "John Doe",              "age": 45,              "address": "Doe Street, 23, Java Town"            }          """;    System.out.println(text);}

正如所看到的,這樣可以很容易地編寫需要大量使用轉(zhuǎn)義字符的Json和類似的字符串。kYd28資訊網(wǎng)——每日最新資訊28at.com

此外,結(jié)尾的三個雙引號表示文本塊的開始或其在輸出中的縮進。在上面的示例中,輸出中每行的位置都比最后一個字符后面的雙引號向后兩個空格。kYd28資訊網(wǎng)——每日最新資訊28at.com

引入了兩個新的轉(zhuǎn)義字符,'/s'用于添加空格,'/n'用于刪除換行符。在編寫長SQL語句時特別有用。kYd28資訊網(wǎng)——每日最新資訊28at.com

private static void sqlStatement() {    String sql = """    SELECT id, firstName, lastName/s/    FROM Employee    WHERE departmentId = "IT" /    ORDER BY lastName, firstName""";    System.out.println(text);}

2. 改進的Switch語句

在Java 17中,對Switch語句進行了進一步的改進,可以解決忘記寫break關(guān)鍵字導(dǎo)致的bug問題。kYd28資訊網(wǎng)——每日最新資訊28at.com

Switch表達式是一種更靈活的Switch語法形式,在每個case塊中可以返回一個值,并且可以在賦值等操作中使用這些返回值。它使用箭頭符號(->)代替冒號(:)來表示返回的表達式。kYd28資訊網(wǎng)——每日最新資訊28at.com

在此表達式中,當(dāng)使用switch返回時,不需要使用break關(guān)鍵字來終止每個case塊,但是需要使用default case。kYd28資訊網(wǎng)——每日最新資訊28at.com

這種改進使得Switch語句更加簡潔和易讀,并且減少了由于忘記寫break而導(dǎo)致的錯誤。kYd28資訊網(wǎng)——每日最新資訊28at.com

private static void improvedSwitch(Fruit fruit) {    String text = switch (fruit) {        case APPLE, PEAR -> {            System.out.println("the given fruit was: " + fruit);            yield "Common fruit";        }        case ORANGE, AVOCADO -> "Exotic fruit";        default -> "Undefined fruit";    };    System.out.println(text);}

如果在switch case中進行多個操作,我們可以使用case塊,并使用yield關(guān)鍵字表示返回值。yield在這里是上下文相關(guān)的關(guān)鍵字,即在函數(shù)的其他地方可以有一個變量名yield。kYd28資訊網(wǎng)——每日最新資訊28at.com

3. 'record'類型

Record類是一種特殊的不可變類,旨在替代數(shù)據(jù)傳輸對象(DTO)。kYd28資訊網(wǎng)——每日最新資訊28at.com

通常情況下,如果我們想在類或方法中使用一些POJO(普通Java對象),我們需要聲明該類,并定義所有的getters、setters、equals和hashCode函數(shù)。例如,在其他地方使用一個樣例 Fruit 類,我們需要用以下方式定義類:kYd28資訊網(wǎng)——每日最新資訊28at.com

public class Fruit {    private String name;    private int price;    //獲取器和設(shè)置器方法、equals 和 hashcode 方法}

盡管可以使用像 lombok 這樣的庫來減少大部分樣板代碼,但是如果借助 records,可以進一步減少代碼量,無需依賴額外的庫。kYd28資訊網(wǎng)——每日最新資訊28at.com

使用 records 后,相同的代碼變?yōu)椋?span style="display:none">kYd28資訊網(wǎng)——每日最新資訊28at.com

public static void doSomething() {  record Fruit(String name, int price) {}  Fruit fruit = new Fruit("Apple", 100);  System.out.println(fruit.getPrice());}

如我們所見,使用Record類甚至可以在方法內(nèi)定義一個局部的record對象。這個record對象會自動為其所有字段生成getter、setter、equals和hashCode方法。kYd28資訊網(wǎng)——每日最新資訊28at.com

Record中的字段是不可變的,只能通過在聲明record時提供的參數(shù)進行定義。但我們可以定義靜態(tài)變量。我們還可以定義一個自定義構(gòu)造函數(shù)來驗證字段。建議不要重寫record的getter和setter,否則會影響其不可變性。kYd28資訊網(wǎng)——每日最新資訊28at.com

下面是一個具有多個構(gòu)造函數(shù)、靜態(tài)變量和方法的 record 的示例:kYd28資訊網(wǎng)——每日最新資訊28at.com

public record Employee(int id, String firstName,                       String lastName){   static int empToken;    // 緊湊構(gòu)造函數(shù)    public Employee    {        if (id < 100) {            throw new IllegalArgumentException(                "Employee Id cannot be below 100.");        }        if (firstName.length() < 2) {            throw new IllegalArgumentException(                "First name must be 2 characters or more.");        }    }        // 另一種構(gòu)造函數(shù)    public Employee(int id, String firstName)    {        this(id, firstName, null);    }    // 實例方法    public void getFullName()    {        if (lastName == null)            System.out.println(firstName());        else            System.out.println(firstName() + " "                               + lastName());    }    // 靜態(tài)方法    public static int generateEmployeeToken()    {        return ++empToken;    }}

record 類的更多特性還包括:kYd28資訊網(wǎng)——每日最新資訊28at.com

  • 可以在 record 中使用嵌套類和接口。
  • 可以嵌套記錄,嵌套記錄將自動成為靜態(tài)的。
  • 記錄可以實現(xiàn)接口。
  • 可以創(chuàng)建泛型記錄類。
  • 記錄可序列化。

4. 'sealed' 類

sealed 類為我們提供了更多對擴展類的控制權(quán)。kYd28資訊網(wǎng)——每日最新資訊28at.com

在 Java 11 中,類可以是 final 或可擴展的。如果您想控制哪些類可以擴展您的超類,可以將所有類放在同一個包中,并將超類設(shè)為包可見性。然而,從包外部無法訪問超類。例如,看下面的代碼:kYd28資訊網(wǎng)——每日最新資訊28at.com

public abstract class Fruit {}public final class Apple extends Fruit {}public final class Pear extends Fruit {}
private static void problemSpace() {    Apple apple = new Apple();    Pear pear = new Pear();    Fruit fruit = apple;    class Avocado extends Fruit {};}

在這里,我們無法阻止 Avocado 擴展 Fruit 類。如果我們將 Fruit 類設(shè)置為默認訪問級別,那么將無法把 apple 分配給 fruit 對象。kYd28資訊網(wǎng)——每日最新資訊28at.com

Java 17 引入sealed 類新特性,用于限制類的繼承層級。通過使用 sealed 關(guān)鍵字,可以控制哪些類可以擴展或?qū)崿F(xiàn)一個特定的父類或接口,只允許特定的類擴展我們的超類。以下是一個示例:kYd28資訊網(wǎng)——每日最新資訊28at.com

public abstract sealed class FruitSealed permits AppleSealed, PearSealed {}public non-sealed class AppleSealed extends FruitSealed {}public final class PearSealed extends FruitSealed {}

如我們所見,這里使用了一個新的關(guān)鍵字 sealed 來表示這是一個 sealed 類。使用 permits 關(guān)鍵字定義可以擴展的類。任何擴展 sealed 類的類都可以是 final 類,如 PearSealed,或者可以在聲明類時使用 non-sealed 關(guān)鍵擴展的其他類,比如 AppleSealed。kYd28資訊網(wǎng)——每日最新資訊28at.com

這種實現(xiàn)允許將 AppleSealed 分配給 FruitSealed 類,但不允許 permits 關(guān)鍵字未定義的其他類擴展 FruitSealed 類。kYd28資訊網(wǎng)——每日最新資訊28at.com

5. 使用 'instanceof' 的模式匹配

在 Java 11 中,我們通常使用 instanceof 運算符來檢查一個對象是否屬于某個類。如果我們希望在 instance of 檢查返回 true 后對其進行某些操作,需要顯式將對象轉(zhuǎn)換為該特定類。以下是一個示例:kYd28資訊網(wǎng)——每日最新資訊28at.com

private static void oldStyle() {    Object o = new Grape(Color.BLUE, 2);    if (o instanceof GrapeClass) {        Grape grape = (Grape) o;        System.out.println("This grape has " + grape.getPits() + " pits.");    }}

在這里,我們需要顯式將對象轉(zhuǎn)換為 Grape 類型,然后找出核數(shù)。kYd28資訊網(wǎng)——每日最新資訊28at.com

使用 Java 17,可以將其更改為:kYd28資訊網(wǎng)——每日最新資訊28at.com

private static void patternMatchingInJava17() {     Object o = new Grape(Color.BLUE, 2);     if (o instanceof Grape grape) {         System.out.println("This grape has " + grape.getPits() + " pits.");     }}

可以將 instance of 檢查與 &&(and)條件配對使用,但不能使用 ||(or)條件。因為如果是“or”條件,即使 instance of 檢查返回 false,語句也可能達到另一個條件。kYd28資訊網(wǎng)——每日最新資訊28at.com

如果 instance of 檢查返回 true,變量 grape 的作用域甚至可以超出 if 塊。在下面的示例中,如果對象不是 Grape 類型,將拋出 RuntimeException 異常,因此編譯器在達到打印語句時會確保 grape 對象存在。kYd28資訊網(wǎng)——每日最新資訊28at.com

private static void patternMatchingScopeException() {    Object o = new Grape(Color.BLUE, 2);    if (!(o instanceof  Grape grape)) {        throw new RuntimeException();    }    System.out.println("This grape has " + grape.getPits() + " pits.");}

6. 有用的空指針異常(NullPointerException)

在Java 11中,當(dāng)遇到空指針異常時,我們只能得到異常發(fā)生的行號,但無法得知導(dǎo)致空指針異常的方法或變量。kYd28資訊網(wǎng)——每日最新資訊28at.com

在Java 17中,錯誤消息得到了改進,空指針異常的消息會告訴我們導(dǎo)致空指針異常的具體方法調(diào)用。kYd28資訊網(wǎng)——每日最新資訊28at.com

public static void main(String[] args) {    HashMap<String, Grape> grapes = new HashMap<>();    grapes.put("grape1", new GrapeClass(Color.BLUE, 2));    grapes.put("grape2", new GrapeClass(Color.WHITE, 4));    grapes.put("grape3", null);    var color = ((Grape) grapes.get("grape3")).getColor();}

正如所看到的,這里試圖獲取一個為null的"grape3"對象的顏色。當(dāng)我們比較在Java 11和Java 17中獲得的錯誤消息時,我們可以看到錯誤消息的差異,現(xiàn)在我們確切地知道在map中對null對象調(diào)用get方法導(dǎo)致了異常。kYd28資訊網(wǎng)——每日最新資訊28at.com

// Java 11Exception in thread "main" java.lang.NullPointerException        at com.rg.java17.HelpfulNullPointerExceptions.main(HelpfulNullPointerExceptions.java:13)
// Java 17Exception in thread "main" java.lang.NullPointerException: Cannot invoke "com.rg.java17.Grape.getColor()" because the return value of "java.util.HashMap.get(Object)" is null    at com.rg.java17.HelpfulNullPointerExceptions.main(HelpfulNullPointerExceptions.java:13)

三、更多改進

1. 支持緊湊型數(shù)字格式化

在NumberFormat類中添加了一個工廠方法,用于根據(jù)Unicode標(biāo)準(zhǔn)以緊湊、人類可讀的形式格式化數(shù)字。有SHORT和LONG兩種格式可用,示例如下:kYd28資訊網(wǎng)——每日最新資訊28at.com

NumberFormat shortFormat = NumberFormat.getCompactNumberInstance(Locale.ENGLISH, NumberFormat.Style.SHORT);System.out.println(shortFormat.format(1000))NumberFormat longFormat = NumberFormat.getCompactNumberInstance(Locale.ENGLISH, NumberFormat.Style.LONG);System.out.println(shortFormat.format(1000))// 輸出1K1 thousand

2. 新增日周期支持

在DateTime模式中添加了一個新的模式"B",用于指定一天中的時間。kYd28資訊網(wǎng)——每日最新資訊28at.com

DateTimeFormatter timeOfDayFormatter = DateTimeFormatter.ofPattern("B");System.out.println(timeOfDayFormatter.format(LocalTime.of(8, 0)));System.out.println(timeOfDayFormatter.format(LocalTime.of(13, 0)));System.out.println(timeOfDayFormatter.format(LocalTime.of(20, 0)));System.out.println(timeOfDayFormatter.format(LocalTime.of(23, 0)));System.out.println(timeOfDayFormatter.format(LocalTime.of(0, 0)));// 輸出早上下午晚上夜間午夜

3. 性能基準(zhǔn)測試

在內(nèi)存使用和時間復(fù)雜度方面,Java 17相對于Java 11也有所改進。其中進行了一項基準(zhǔn)測試,對兩個版本的代碼進行性能測試,讓它們執(zhí)行一系列任務(wù)。kYd28資訊網(wǎng)——每日最新資訊28at.com

一些總體結(jié)果如下:kYd28資訊網(wǎng)——每日最新資訊28at.com

  • 對于G1GC(默認垃圾收集器),Java 17比Java 11快8.66%,比Java 16快2.41%。
  • 對于ParallelGC(并行垃圾收集器),Java 17比Java 11快6.54%,比Java 16快0.37%。
  • 并行垃圾收集器(Java 17可用)比G1垃圾收集器(Java 11使用的垃圾收集器)快16.39%。

從Java 11遷移到Java 17可帶來多項好處,包括新功能和性能改進。然而,在遷移過程中需要注意潛在的問題。許多庫也會升級到支持Java 17的新版本,因此在使用外部庫時需要謹慎。通過了解可能出現(xiàn)的問題并采取必要的步驟解決,可以確保您順利地遷移到Java 17。kYd28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-11262-0.html八個從Java 11到Java17中的功能提升

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: C++11中auto關(guān)鍵字的深入理解與應(yīng)用

下一篇: Java是怎么運行起來的?深入理解Java虛擬機

標(biāo)簽:
  • 熱門焦點
  • 2023年Q2用戶偏好榜:12+256G版本成新主流

    3月份的性能榜、性價比榜和好評榜之后,就要輪到2023年的第二季度偏好榜了,上半年的新機潮已經(jīng)過去,最明顯的肯定就是大內(nèi)存和存儲的機型了,另外部分中端機也取消了屏幕塑料支架
  • 十個可以手動編寫的 JavaScript 數(shù)組 API

    JavaScript 中有很多API,使用得當(dāng),會很方便,省力不少。 你知道它的原理嗎? 今天這篇文章,我們將對它們進行一次小總結(jié)。現(xiàn)在開始吧。1.forEach()forEach()用于遍歷數(shù)組接收一參
  • Flowable工作流引擎的科普與實踐

    一.引言當(dāng)我們在日常工作和業(yè)務(wù)中需要進行各種審批流程時,可能會面臨一系列技術(shù)和業(yè)務(wù)上的挑戰(zhàn)。手動處理這些審批流程可能會導(dǎo)致開發(fā)成本的增加以及業(yè)務(wù)復(fù)雜度的上升。在這
  • 在線圖片編輯器,支持PSD解析、AI摳圖等

    自從我上次分享一個人開發(fā)仿造稿定設(shè)計的圖片編輯器到現(xiàn)在,不知不覺已過去一年時間了,期間我經(jīng)歷了裁員失業(yè)、面試找工作碰壁,寒冬下一直沒有很好地履行計劃.....這些就放在日
  • 使用LLM插件從命令行訪問Llama 2

    最近的一個大新聞是Meta AI推出了新的開源授權(quán)的大型語言模型Llama 2。這是一項非常重要的進展:Llama 2可免費用于研究和商業(yè)用途。(幾小時前,swyy發(fā)現(xiàn)它已從LLaMA 2更名為Lla
  • 當(dāng)家的盒馬,加速謀生

    來源 | 價值星球Planet作者 | 歸去來自己&ldquo;當(dāng)家&rdquo;的盒馬,開始加速謀生了。據(jù)盒馬官微消息,盒馬計劃今年開放生鮮供應(yīng)鏈,將其生鮮商品送往食堂。目前,盒馬在上海已經(jīng)與
  • 華為HarmonyOS 4.0將于8月4日發(fā)布 或搭載AI大模型技術(shù)

    華為宣布HarmonyOS4.0將于8月4日正式發(fā)布。此前,華為已經(jīng)針對開發(fā)者公布了HarmonyOS4.0,以便于開發(fā)者提前進行適配,也因此被曝光出了一些新系統(tǒng)的特性
  • 質(zhì)感不錯!OPPO K11渲染圖曝光:旗艦IMX890傳感器首次下放

    一直以來,OPPO K系列機型都保持著較為均衡的產(chǎn)品體驗,歷來都是2K價位的明星機型,去年推出的OPPO K10和OPPO K10 Pro兩款機型憑借各自的出色配置,堪稱有
  • Meta盲目擴張致超萬人被裁,重金押注元宇宙而前景未明

    圖片來源:圖蟲創(chuàng)意日前,Meta創(chuàng)始人兼CEO 馬克&middot;扎克伯發(fā)布公開信,宣布Meta計劃裁員超11000人,占其員工總數(shù)13%。他公開承認了自己的預(yù)判失誤:&ldquo;不僅
Top