作者丨Sergei Dzeboev
編譯丨諾亞
Java17給Java帶來了一些變化,但也使許多開發人員重新考慮他們遷移到其他JVM語言的愿望。最明顯的變化是在使Java代碼現代化和添加新的語言結構以簡化它的方向上進行的。當然,這個問題并非沒有對Java核心的改變,這使得Java更加高效。
文本塊功能終于出現在Java中。我確信這是Java程序員等待已久的變化之一。現在你可以忘記難以閱讀的長復合行。文本塊允許你以最方便的方式編寫多行文本。在這樣的塊中,你可以按照自己希望的方式撰寫文本,并且仍然可以使用轉義序列進行更精確的格式設置。
Java11. 字符串轉義序列:
public String poem = " " + "Twinkle, Twinkle, Little Star/n" + " /n" + " Twinkle, twinkle, little star,/n" + " How I wonder what you are!/n" + " Up above the world so high,/n" + " Like a diamond in the sky./n" + " /n" + " Twinkle, twinkle, little star,/n" + " How I wonder what you are!";
Java17.文本塊:
public String poem = """ Twinkle, Twinkle, Little Star Twinkle, twinkle, little star, How I wonder what you are! Up above the world so high, Like a diamond in the sky. Twinkle, twinkle, little star, How I wonder what you are! """;
另一個慢慢使Java語言更有用的更新是record。以前,要創建一個類,我們需要描述該類,指定其字段,并添加必要的方法,例如equals、hashcode、getter和setters。自從record出現以來,所有這些現在都變得不必要了。
record允許你通過僅指定必填字段來創建數據安全類;將自動創建所有其他方法。但是,值得記住的是,record充當數據類,創建是為了存儲數據,而不是執行各種操作。record是線程安全的,因為所有record字段都是最終的。最后要知道的重要一點是,用于獲取字段值的生成方法不會像經典Java Bean 中那樣包含“get”。
Java11.數據類:
public class DataClass { public DataClass (Integer id, String name) { this.id = id; this.name = name; } private final Integer id; private final String name; public Integer getId() { return id; } public String getName() { return name; } @Override public boolean equals(Object o) { ... } @Override public int hashCode() { ... }}
Java17.Record:
public record DataClass(Integer id, String name) {}
區別很明顯:在執行相同功能的同時,創建Record所需的代碼行要少得多。
更改列表還包括切換表達式。這些更改不僅影響了Switch表達式的語法(使其編寫更加簡潔),還影響了功能。Switch表達式現在返回迭代的結果,使編寫代碼變得更加容易,并使其更加簡潔。新的開關表達式不再需要每個case后面都加一個break
Java11.switch表達式:
public String getSeasonDescription(Season season) { String seasonDescription; switch (season) { case SPRING: seasonDescription = "Flowers are blooming!"; break; case SUMMER: seasonDescription = "It's hot outside!"; break; case AUTUMN: seasonDescription = "Leaves are falling!"; break; case WINTER: seasonDescription = "Snow is coming!"; break; default: throw new IllegalStateException("Invalid season: " + season); } return seasonDescription; }
Java 17. 增強的 Switch 表達式:
public String getSeasonDescription(Season season) { return switch (season) { case SPRING -> "Flowers are blooming!"; case SUMMER -> "It's hot outside!"; case AUTUMN -> "Leaves are falling!"; case WINTER -> "Snow is coming!"; }; }
另一項設計改進也影響了操作員?,F在,更安全,更簡潔。通過此更改,不再需要首先檢查給定對象是否是某個類的實例,然后執行強制轉換;現在可以在一行中完成此操作。如前所述,這不僅僅是語法糖,而是一個更優化的運算符。
Java 11. 經典的 intanceof
public void findInstance(Object o) { if (o instanceof String) { String s = (String) o; System.out.printf("Object is a string %s", s); } else if (o instanceof Number) { Number n = (Number) o; System.out.printf("Object is a number %n", n); } }
Java 17. 更新的 intanceof
public void findInstance(Object o) { if (o instanceof String s) { System.out.printf("Object is a string %s", s); } else if (o instanceof Number n) { System.out.printf("Object is a number %n", n); } }
Java 17也考慮了安全性,并朝著這個方向邁出了重要的一步。這個想法是限制類或接口的繼承,同時保持其公開。結果,新的類類型,密封類,被添加到Java中。密封類的語法允許你指定可以使用其功能的后代。反過來,繼承者還可以允許或拒絕繼承,或者指定可以沿鏈繼承的類。此功能使你可以更靈活地創建項目,并方便地調整代碼的API。
Java 17. 密封類:
public sealed class SealedClass permits AnotherSealedClass, AnotherNonSealedClass, AnotherFinalClass {}
Java 17. 非密封繼承人:
public non-sealed class AnotherNonSealedClass extends SealedClass {}
Java17.最終繼承人:
public final class AnotherFinalClass extends SealedClass {}
Java17.密封繼承人:
public sealed class AnotherSealedClass extends SealedClass permits AnotherNonSealedClassTwo {}
Javai17.非密封繼承人二級:
public non-sealed class AnotherNonSealedClassTwo extends AnotherSealedClass {}
最后,Java 17 中一個非常有用的更新是改進的NullPointerException!最后,在堆棧跟蹤日志中,你可以看到哪個特定字段導致了NullPointerException。僅此功能就應該鼓勵你切換到Java 17。你不再需要長時間在代碼中四處尋找發生異常的險惡地方;現在Java將為你完成所有工作。
Java11.NPE:
public static void main(String... args) { String s = null; System.out.println(s.toLowerCase()); }
Exception in thread "main" java.lang.NullPointerException at Main.main(Main.java:4)
Java17.改進的NPE:
public static void main(String... args){ String s = null; System.out.println(s.toLowerCase()); }
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "String.toLowerCase()" because "s" is null at edu.javamodules/edu.javaversions.eleventoseventeen.NpeExample.main(NpeExample.java:7)
當然,這并不是Java17中所做的更改的全部列表,但是討論的創新是最引人注目的。與往常一樣,Java開發人員在改進JVM方面做得非常出色,使其更加高效。
Java17中所做的所有改進都傳達了一個信息:是時候切換到這個版本了。過渡承諾語法更簡潔,性能得到提高。你的項目將獲得安全性、靈活性和更好的錯誤消息。如果你已經遷移到Java11,那么遷移到Java17 會很順利。Java的競爭優勢在這里大放異彩,因為向后兼容性允許你切換到Java17而無需更改任何代碼,并利用所有更新的功能。Java17是Java11以來又一個LTS(長期支持)版本,可確保你在較長時間內收到所有必要的安全更新。
原文鏈接:https://hackernoon.com/is-migrating-from-java-11-to-java-17-worth-it
本文鏈接:http://www.tebozhan.com/showinfo-26-5140-0.html從 Java 11 遷移到 Java 17 值得嗎?
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com
上一篇: 大模型速度狂飆2.39倍!清華聯手微軟首提SoT,讓LLM思考更像人類
下一篇: Rust“巨坑”?真相來了!