--- title: Java 14 å¼ç®±ï¼æ°ç¹æ§Recordãinstanceofãswitché¦é¦é¦é¦ shortTitle: Java 14 æ°ç¹æ§ category: - Javaæ ¸å¿ tag: - Javaæ°ç¹æ§ description: æ¬æè¯¦ç»ä»ç»äºJava 14çæ°ç¹æ§ï¼å æ¬Recordãinstanceofåswitchè¯å¥çæ¹è¿ãéè¿å®é ç代ç 示ä¾ï¼å±ç¤ºäºå¦ä½ä½¿ç¨è¿äºæ°ç¹æ§æ¥ç®å代ç ï¼æé«ç¼ç¨æçãå¦ä¹ æ¬æï¼è®©æ¨å¿«éäºè§£Java 14çæ°äº®ç¹ï¼é¢ç¥æ°ç¹æ§å¸¦æ¥çç¼ç¨é åã head: - - meta - name: keywords content: Java,Java SE,Javaåºç¡,Javaæç¨,äºå¥çJavaè¿é¶ä¹è·¯,Javaè¿é¶ä¹è·¯,Javaå ¥é¨,æç¨,java8,java Record,java instanceof,java switch --- Java 14 çæ¶åï¼æ°å¢äºè®°å½ Recordãæ¨¡å¼å¹é instanceof çæ°ç¹æ§ï¼è½¬æ£äº Java 12 æ¶ç switch 表达å¼ï¼æä»¬ä¸èµ·æ¥è¿ä¸éã  ### 01ãä¸è½½ JDK 14 > æªæ¢å°2023å¹´03æ30æ¥ï¼Java 20 å·²ç»åå¸äºï¼ä¸è¿ä¸æ¯ LTSï¼é¿ææ¯æï¼çæ¬ï¼Java 17ã11ã8 æ¯ç®åæä¾æ¯æç LTS çæ¬ã è¦æ³å¼ç®±ï¼å¾å ä¸è½½ JDK 14ï¼å¦æä½ ææ´é«çæ¬ï¼å½ç¶ä¹å¯ä»¥ï¼ï¼ä¸ç¶æ¿ä»ä¹å¼ç®±å¢ï¼å¯¹å§ï¼æ 2 å¤å°æ¹å¯ä¾ä¸è½½ï¼Oracle ä¸å¯ä»¥ä¸è½½åç¨çï¼ [jdk.java.net](https://jdk.java.net/14/) ä¸å¯ä»¥ä¸è½½å¼æºçãæä»¬å°±éæ©åè å§ã  æç®åç¨çæ¯ Windows æä½ç³»ç»ï¼æä»¥å°±éæ© Windows çç zip å è¿è¡ä¸è½½ï¼å®æåè®°å¾è§£åã ### 02ãå级 IntelliJ IDEA >æªæ¢å° 2023å¹´03æ30æ¥ï¼Intellij IDEA çææ°çæ¬æ¯ 2023.1ã éè¦æ IDEA åçº§å°æ¢å ä½éªç 2020.1 EAPï¼å¦æä½ å½å使ç¨ççæ¬å¤§äºæ¤ï¼å½ç¶ä¹å¯ä»¥ï¼ï¼å¦åæ æ³æ¯æ Java 14 çæ°ç¹æ§ã  社åºççä¸è½½å°åå¦ä¸æç¤ºï¼ ``` [https://www.jetbrains.com/idea/nextversion/#section=windows](https://www.jetbrains.com/idea/nextversion/#section=windows) ``` å®è£ çæ¶åå¯ä»¥æä¹åççæ¬å¸è½½ï¼ä¹å¯ä»¥éæ©ä¿çã宿åï¼æä»¬æ¥æ°å»ºä¸ä¸ª Java 14 ç项ç®ã  ### 01ãinstanceof æç §æ°ç¹æ§ç顺åºï¼æä»¬å°±å ä» instanceof 说起å§ãæ§å¼ç instanceof çç¨æ³å¦ä¸æç¤ºï¼ ```java public class OldInstanceOf { public static void main(String[] args) { Object str = "Java 14ï¼çé¦"; if (str instanceof String) { String s = (String)str; System.out.println(s.length()); } } } ``` éè¦å ä½¿ç¨ instanceof å¨ if æ¡ä»¶ä¸å¤æ str çç±»åæ¯å¦ä¸º Stringï¼ç¬¬ä¸æ¥ï¼ï¼åå¨ if è¯å¥ä¸å° str 强转为å符串类åï¼ç¬¬äºæ¥ï¼ï¼å¹¶ä¸è¦éæ°å£°æä¸ä¸ªåéç¨äºå¼ºè½¬åçèµå¼ï¼ç¬¬ä¸æ¥ï¼ã ä¸ä¸ªæ¥éª¤ä¹ä¸ç®å¤ï¼ä½æ»è§å¾åºè¯¥è¿ææ´å¥½çè¯æ³ï¼è¿ä¸ï¼Java 14 å°±æ³å°äºè¿ä¸å±ã ```java public class NewInstanceOf { public static void main(String[] args) { Object str = "Java 14ï¼çé¦"; if (str instanceof String s) { System.out.println(s.length()); } } } ``` å¯ä»¥ç´æ¥å¨ if æ¡ä»¶å¤æç±»åçæ¶åæ·»å ä¸ä¸ªåéï¼å°±ä¸éè¦å强转åå£°ææ°çåéäºãæ¯ä¸æ¯ç¹å«ç®æ´ï¼ä½æ¨¡å¼å¹é ç instanceof å¨ Java 14 䏿¯é¢è§ççï¼é»è®¤æ¯ä¸å¯ç¨çï¼æä»¥è¿æ®µä»£ç 伿ä¸ä¸ªå¥æªçç¼è¯é误ï¼Java 14 ä¸ä¸æ¯ææ¨¡å¼å¹é ç instanceofï¼ã  飿ä¹è§£å³è¿ä¸ªé®é¢å¢ï¼éè¦å¨é¡¹ç®é ç½®ä¸æå¨è®¾ç½®ä¸ä¸è¯è¨ççæ¬ã  è®¾ç½®å®æåï¼ç¼è¯é误就éé£é£èµ°äºãç¨åºè¾åºçç»æå¦ä¸æç¤ºï¼ ``` 10 ``` ä¸éä¸éï¼çé¦ãæ³ç¥é Java ç¼è¯å¨å¨èå帮æä»¬åäºä»ä¹åï¼çä¸ä¸åç¼è¯åçåèç å°±æç½äºã ```java public class NewInstanceOf { public NewInstanceOf() { } public static void main(String[] args) { Object str = "Java 14ï¼çé¦"; String s; if (str instanceof String && (s = (String)str) == (String)str) { System.out.println(s.length()); } } } ``` å¨ if æ¡ä»¶å¤æåï¼å 声æäºåé sï¼ç¶åå¨ if æ¡ä»¶ä¸è¿è¡äºå¼ºè½¬ `s = (String)str)`ï¼å¹¶ä¸å¤æäº s å str æ¯å¦ç¸çãç¡®å®æ¯ä¸ä¸ªè§£æ¾å¼æ¾è ç产åçå¥½ç¹æ§ï¼å¼ºç叿è¿ä¸ªç¹æ§å¨ä¸ä¸ªçæ¬ä¸è½¬æ£ã ### 02ãRecords å¨ä¹åçä¸ç¯æç« ä¸ï¼æè°å°äº[ç±»çä¸å¯åæ§](https://javabetter.cn/basic-extra-meal/immutable.html)ï¼å®æ¯è¿æ ·å®ä¹çï¼ ```java public final class Writer { private final String name; private final int age; public Writer(String name, int age) { this.name = name; this.age = age; } public int getAge() { return age; } public String getName() { return name; } } ``` é£ä¹ï¼å¯¹äº Records æ¥è¯´ï¼ä¸æ¡ Record 就代表ä¸ä¸ªä¸åçç¶æã尽管å®ä¼æä¾è¯¸å¦ `equals()`ã`hashCode()`ã`toString()`ãæé æ¹æ³ï¼ä»¥ååæ®µç getterï¼ä½å®æ ææ¿ä»£å¯å对象çç±»ï¼æ²¡æ setterï¼ï¼ä»¥å Lombok æä¾çåè½ã æ¥ç¨ Records æ¿ä»£ä¸ä¸ä¸é¢è¿ä¸ª Writer ç±»ï¼ ```java public record Writer(String name, int age) { } ``` ä½ çï¼ä¸è¡ä»£ç å°±æå®ãå ³é®æ¯æ¯ä¹åç代ç åè½æ´ä¸°å¯ï¼æ¥çä¸ä¸åç¼è¯åçåèç ï¼ ```java public final class Writer extends java.lang.Record { private final java.lang.String name; private final int age; public Writer(java.lang.String name, int age) { /* compiled code */ } public java.lang.String toString() { /* compiled code */ } public final int hashCode() { /* compiled code */ } public final boolean equals(java.lang.Object o) { /* compiled code */ } public java.lang.String name() { /* compiled code */ } public int age() { /* compiled code */ } } ``` ç±»æ¯ final çï¼åæ®µæ¯ private final çï¼æé æ¹æ³æä¸¤ä¸ªåæ°ï¼`toString()`ã`hashCode()`ã`equals()` æ¹æ³ä¹æäºï¼getter æ¹æ³ä¹æäºï¼åªä¸è¿æ²¡æ get åç¼ã使¯æ²¡æ setter æ¹æ³ï¼ä¹å°±æ¯è¯´ Records ç¡®å®éå¯¹çæ¯ä¸å¯å对象ââé´å®å®æ¯ã飿ä¹ä½¿ç¨ Records å¢ï¼ ```java public class WriterDemo { public static void main(String[] args) { Writer writer = new Writer("æ²é»çäº",18); System.out.println("toStringï¼" + writer); System.out.println("hashCodeï¼" + writer.hashCode()); System.out.println("nameï¼" + writer.name()); System.out.println("ageï¼" + writer.age()); Writer writer1 = new Writer("æ²é»çäº", 18); System.out.println("equalsï¼" + (writer.equals(writer1))); } } ``` ç¨åºè¾åºçç»æå¦ä¸æç¤ºï¼ ``` toStringï¼Writer[name=æ²é»çäº, age=18] hashCodeï¼1130697218 nameï¼æ²é»çäº ageï¼18 equalsï¼true ``` ä¸éä¸éï¼çé¦ï¼ä»¥åå®ä¹ä¸å¯åç±»æ¶å°±ç®åäºï¼å¼ºç叿è¿ä¸ªç¹æ§å¨ä¸ä¸ªçæ¬ä¸è½¬æ£ã ### 03ãswitch è¡¨è¾¾å¼ å ³äº switch 表达å¼ï¼æå¨ä¹åçä¸ç¯æç« ä¸å·²ç»è¯¦ç»è¯´æäºï¼ç¹å»[ä¼ éé¨](https://mp.weixin.qq.com/s/1BDDLDSKDGwQAfIFMyySdg)å¯ä»¥è·³è½¬è¿å»ççã䏤卿¶é´è¿å»äºï¼switch 表达å¼ç»äºâ媳å¦ç¬æå©âï¼è½¬æ£äºï¼æåæåã è®°å¾è¿ç¯æç« åè¡¨å°æéçæ¶åï¼è¢«å·ååç§æ è dissï¼è¯´ï¼âè¿ä»¥ä¸ºä½ æä»ä¹æå·§ï¼æ²¡æ³å°ç¨çæ¯ Java 13ï¼å¯æä»¬è¿åçå¨ Java 8 åï¼âè¿æ¾ç¶æ¯ä¸ç§åºæ¥èªå°çå¿æï¼é常ä¸å¯åï¼ç¨åºåä¸åºè¯¥è¿æ ·ãä¸ä¸ªæç®åçéçå°±æ¯ï¼Java 6 å½å¹´ä¹å¾ç»å ¸ï¼ä¸æ¯è¢« Java 8 å代äºåï¼éçæ¶é´çæ¨ç§»ï¼Java 8 æ©æä¼è¢«æ´åæ¶ä»£çæ°çæ¬å代ââæ»è¦è¿æ¥åã å ³äº switch 表达å¼ï¼è¿éå°±ç®åå°æ¬ä¸ªä¾åç»ä½ ç§ç§ï¼ ```java public class SwitchDemo { enum PlayerTypes { TENNIS, FOOTBALL, BASKETBALL, PINGPANG, UNKNOWN } public static void main(String[] args) { System.out.println(createPlayer(PlayerTypes.BASKETBALL)); } private static String createPlayer(PlayerTypes playerType) { return switch (playerType) { case TENNIS -> "ç½çè¿å¨å费德å"; case FOOTBALL -> "è¶³çè¿å¨åCç½"; case BASKETBALL -> "篮çè¿å¨åè©¹å§æ¯"; case PINGPANG -> "ä¹ä¹çè¿å¨å马é¾"; case UNKNOWN -> throw new IllegalArgumentException("æªç¥"); }; } } ``` é¤äºå¯ä»¥ä½¿ç¨ `->` çæ°å¼è¯æ³ï¼è¿å¯ä»¥ä½ä¸º return ç»æï¼çé¦ã ### 04ãText Blocks 卿æ¬åï¼Text Blocksï¼åºç°ä¹åï¼å¦ææä»¬éè¦æ¼æ¥å¤è¡çå符串ï¼å°±éè¦å¾å¤è±æåå¼å·åå å·ï¼çèµ·æ¥å°±å¥½åè太å©ç裹èå¸ï¼é常ä¸é ã妿æ°å¥½è¦æ¼æ¥ä¸äº HTML æ ¼å¼çææ¬ï¼åç SQL 乿¯å¦æ¤ï¼çè¯ï¼è¿è¦éè¿ç©ºæ ¼è¿è¡æçï¼éè¿æ¢è¡è½¬ä¹ç¬¦ `\n` è¿è¡æ¢è¡ï¼è¿äºç¹ççå·¥ä½å¯¹äºä¸åå¼åäººåæ¥è¯´ï¼ç®ç´å°±æ¯ç¾é¾ã ```java public class OldTextBlock { public static void main(String[] args) { String html = "\n" + "
\n" + "Hello, world
\n" + " \n" + "\n"; System.out.println(html); } } ``` Java 14 å°±å®å ¨ä¸åäºï¼ ```java public class NewTextBlock { public static void main(String[] args) { String html = """Hello, world
"""; System.out.println(html); } } ``` å¤ä½çè±æåå¼å·ãå å·ãæ¢è¡è½¬ä¹ç¬¦ï¼ç»ç»ä¸è§äºãä» ä» æ¯éè¿ååä¸ä¸ªè±æåå¼å·å°±å®ç°äºãæåªè½è¯´ï¼é¦ï¼å®ççé¦ï¼  ---- GitHub 䏿 æ 17000+ ç弿ºç¥è¯åºã[äºå¥ç Java è¿é¶ä¹è·¯](https://github.com/itwanger/toBeBetterJavaer)ã第ä¸ç PDF ç»äºæ¥äºï¼å æ¬Javaåºç¡è¯æ³ãæ°ç»&å符串ãOOPãéåæ¡æ¶ãJava IOãå¼å¸¸å¤çãJava æ°ç¹æ§ãç½ç»ç¼ç¨ãNIOãå¹¶åç¼ç¨ãJVMççï¼å ±è®¡ 32 ä¸ä½åï¼500+å¼ æç»å¾ï¼å¯ä»¥è¯´æ¯éä¿ææãé£è¶£å¹½é»â¦â¦è¯¦æ æ³ï¼[太èµäºï¼GitHub 䏿 æ 17000+ ç Java æç¨](https://javabetter.cn/overview/) 微信æ **æ²é»çäº** ææ«æä¸æ¹äºç»´ç å ³æ³¨äºå¥çååå ¬ä¼å·æ²é»çäºï¼åå¤ **222** å³å¯å è´¹é¢åã 