日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
你可能未曾使用的新Java特性

 Java 是在過去 20 年中一直在市場(chǎng)流行的編程語言。

蒙山網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)公司等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營(yíng)維護(hù)。創(chuàng)新互聯(lián)2013年開創(chuàng)至今到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)。

但是最近幾年各種替代 Java 的聲音不斷。

與 Python,Kotlin,Swift 等現(xiàn)代編程語言相比,開發(fā)人員抱怨 Java 過時(shí)的編程語法。

但是很多人不知道的是,Java 新版做了很多改進(jìn),并為開發(fā)人員提供了更有效的方式來編寫代碼。

如果您想用 Java 更輕松編寫簡(jiǎn)潔和優(yōu)雅的代碼,可以參考以下一些建議,這些語法在 JDK 14 已經(jīng)提供。

1 Try-with-resource 語句

使用 try-catch 塊處理異常,通常需要通過 finally 塊來添加清除代碼?,F(xiàn)在使用 try with resource 語法,開發(fā)人員就不用自己操心資源釋放。

我們可以在 try 括號(hào)內(nèi)添加資源,以便在 try-catch 塊執(zhí)行后關(guān)閉或清理該資源

舊語法

 
 
 
 
  1. Scanner scanner = null;
  2. try {
  3.     scanner = new Scanner(new File("foo.txt"));
  4.     while (scanner.hasNext()) {
  5.         System.out.println(scanner.nextLine());
  6.     }
  7. } catch (FileNotFoundException e) {
  8.     e.printStackTrace();
  9. } finally {
  10.     if (scanner != null) scanner.close();
  11. }

新語法

 
 
 
 
  1. try (Scanner scanner = new Scanner(new File("foo.txt"))) {
  2.     while (scanner.hasNext()) {
  3.         System.out.println(scanner.nextLine());
  4.     }
  5. } catch (FileNotFoundException e) {
  6.     e.printStackTrace();
  7. }

這將大大減少關(guān)閉流或數(shù)據(jù)庫連接的代碼行,并減少由于忘記關(guān)閉流/連接而導(dǎo)致各種錯(cuò)誤的問題。

2 switch 表達(dá)式

開發(fā)人員經(jīng)常遇到需要從條件塊返回值的情況,但是舊的語法不好解決。

舊語法

 
 
 
 
  1. private String getUserRole(User user){
  2.     String userRole = "";
  3.     switch(user.getRole()){
  4.         case 0:
  5.             userRole = "Customer";
  6.             break;
  7.         case 1:
  8.             userRole = "Editor";
  9.             break;
  10.         case 2:
  11.             userRole = "Admin";
  12.             break;
  13.         default: throw new IllegalStateException("Unexpected value: " + user.getRole());
  14.     }
  15.     return userRole;
  16. }

就像 Swift 這些現(xiàn)代語言一樣,Java 12 引入了 switch 表達(dá)式,你可以根據(jù)條件返回值。

新語法

 
 
 
 
  1. private String getUserRoleV2(User user){
  2.     return switch(user.getRole()){
  3.         case 0 -> "Customer";
  4.         case 1 -> "Editor";
  5.         case 2 :
  6.             // for multi line expression use 'yield' keyword
  7.             user.setRights(AuthRights.absolute);
  8.             yield "Admin";
  9.         default -> throw new IllegalStateException("Unexpected value: " + user.getRole());
  10.     };
  11. }

這大大減少了項(xiàng)目中的 LOC(代碼行),并使修改相對(duì)容易。

3 用 var 初始化

Java 本質(zhì)上是嚴(yán)格類型的語言,使用嚴(yán)格類型定義是開發(fā)人員偏好的問題。但是支持類型推斷可以降低代碼復(fù)雜性,Java 10 增加了對(duì)局部變量的類型推斷的支持。

 
 
 
 
  1. private void init(){
  2.     var str = "Java 10"; // infers String
  3.     var list = new ArrayList(); 
  4.     var stream = list.stream(); // infers Stream
  5. }

但 Java 仍然是一種靜態(tài)類型的語言,僅在有足夠的信息可用于初始化時(shí)才推斷類型。因此如果變量滿足以下條件,則使用 var 初始化是合法的:

  • 它只能是局部變量(類成員或函數(shù)參數(shù)不支持)
  • 聲明后應(yīng)立即定義(define)

4 記錄 (record)

使用 Java 最常見的抱怨之一,需要編寫大量代碼來使類可用,例如一堆 toString 或 equals 定義,因此代碼看起來很冗長(zhǎng)。Java 14 提供了 Record 語法,使類型聲明更加簡(jiǎn)潔,當(dāng)我們需要在一個(gè)類名下綁定多個(gè)值時(shí),它非常有用。

這是 Oracle 網(wǎng)站上的一篇文章示例,展示了使用記錄的優(yōu)勢(shì)

 
 
 
 
  1. var order = new FXOrderClassic(1, 
  2.         CurrencyPair.GBPUSD,
  3.         Side.Bid, 1.25, 
  4.         LocalDateTime.now(), 
  5.         1000);

像這樣的標(biāo)準(zhǔn)對(duì)象的調(diào)用,需要定義類型 FXOrderClassic。

舊語法

 
 
 
 
  1. public final class FXOrderClassic {
  2.     private final int units;
  3.     private final CurrencyPair pair;
  4.     private final Side side;
  5.     private final double price;
  6.     private final LocalDateTime sentAt;
  7.     private final int ttl;
  8.     public FXOrderClassic(int units,
  9.                           CurrencyPair pair,
  10.                           Side side,
  11.                           double price,
  12.                           LocalDateTime sentAt,
  13.                           int ttl) {
  14.         this.units = units;
  15.         this.pair = pair; // CurrencyPair is a simple enum
  16.         this.side = side; // Side is a simple enum
  17.         this.price = price;
  18.         this.sentAt = sentAt;
  19.         this.ttl = ttl;
  20.     }
  21.     public int units() {
  22.         return units;
  23.     }
  24.     public CurrencyPair pair() {
  25.         return pair;
  26.     }
  27.     public Side side() {
  28.         return side;
  29.     }
  30.     public double price() { return price; }
  31.     public LocalDateTime sentAt() {
  32.         return sentAt;
  33.     }
  34.     public int ttl() {
  35.         return ttl;
  36.     }
  37.     @Override
  38.     public boolean equals(Object o) {
  39.         if (this == o) return true;
  40.         if (o == null || getClass() != o.getClass())
  41.             return false;
  42.         FXOrderClassic that = (FXOrderClassic) o;
  43.         if (units != that.units) return false;
  44.         if (Double.compare(that.price, price) != 0)
  45.             return false;
  46.         if (ttl != that.ttl) return false;
  47.         if (pair != that.pair) return false;
  48.         if (side != that.side) return false;
  49.         return sentAt != null ?
  50.                 sentAt.equals(that.sentAt) : that.sentAt == null;
  51.     }
  52.     @Override
  53.     public int hashCode() {
  54.         int result;
  55.         long temp;
  56.         result = units;
  57.         result = 31 * result +
  58.                 (pair != null ? pair.hashCode() : 0);
  59.         result = 31 * result +
  60.                 (side != null ? side.hashCode() : 0);
  61.         temp = Double.doubleToLongBits(price);
  62.         result = 31 * result +
  63.                 (int) (temp ^ (temp >>> 32));
  64.         result = 31 * result +
  65.                 (sentAt != null ? sentAt.hashCode() : 0);
  66.         result = 31 * result + ttl;
  67.         return result;
  68.     }
  69.     @Override
  70.     public String toString() {
  71.         return "FXOrderClassic{" +
  72.                 "units=" + units +
  73.                 ", pair=" + pair +
  74.                 ", side=" + side +
  75.                 ", price=" + price +
  76.                 ", sentAt=" + sentAt +
  77.                 ", ttl=" + ttl +
  78.                 '}';
  79.     }
  80. }

新語法

 
 
 
 
  1. public record FXOrder(int units,
  2.                       CurrencyPair pair,
  3.                       Side side,
  4.                       double price,
  5.                       LocalDateTime sentAt,
  6.                       int ttl) {}

5 增強(qiáng)的 instance of

Java 14 引入了 instanceof 模式匹配的功能,這意味著在使用 instanceof 的實(shí)例類型檢查時(shí),不再需要顯式的類型轉(zhuǎn)換。

舊語法

 
 
 
 
  1. private Entries getEntries(User user){
  2.     if (user instanceof Editor) {
  3.         Editor editor = (Editor) user;
  4.         // use editor specific methods
  5.         var entries = editor.getEntries();
  6.         return entries;
  7.     }
  8.     
  9.     return null;
  10. }

新語法

 
 
 
 
  1. private Entries getEntries(User user){
  2.     
  3.     if (user instanceof Editor editor) {
  4.         // use group specific methods
  5.         var entries = editor.getEntries();
  6.         return entries;
  7.     }
  8.     return null;
  9. }

6 文本塊

支持文本塊并不是什么新鮮事,但在 Java 中卻是工程師期待已久的功能。Java 開發(fā)人員總是渴望以更簡(jiǎn)單的方式打印多行字符串文字,而不使用討厭的串聯(lián)。Java 新版支持多行字符串文字。

舊語法

 
 
 
 
  1. String html = "" +
  2. "\n\t" + "" +
  3. "\n\t\t" + "

    \"Hurray! Java 14 is here\"

    " +
  4. "\n\t" + "" +
  5. "\n" + "";

使用三引號(hào) ,就可以使用此功能,該功能在使用結(jié)構(gòu)化字符串時(shí)非常方便,例如以一定的對(duì)齊方式和間距編寫文件或添加多行 html 塊

新語法

 
 
 
 
  1. String html = """
  2.   
  3.     

    "Hurray! Java 14 is here"

  4.   
  5. """;

7 有意義的 NPE (空指針)消息

空指針異常(NPE)一直是 Java 開發(fā)人員的噩夢(mèng),并且是開發(fā)人員遇到的最常見的問題。

但是 NPE 消息常常不能提供有關(guān)該問題的足夠信息。

 
 
 
 
  1. var task = new Task();
  2. final boolean isDataConsumed = task.getData().getBucket().isConsumed;

在代碼段中,可能存在多個(gè)故障點(diǎn),例如

  • getData()返回一個(gè)空值
  • getBucket()返回一個(gè)空值

但以下 NPE 報(bào)錯(cuò)未提供有關(guān)該問題的足夠詳細(xì)信息。

為了解決此問題,Oracle 添加 JEP 358,提供有用的 NullPointExceptions

NullPointerException 通過精確描述哪個(gè)變量來提高 JVM 生成錯(cuò)誤信息的可用性。

你可以通過在 Java 命令中添加以下標(biāo)志來使用此功能

-XX:+ShowCodeDetailsInExceptionMessages

使用該標(biāo)志,JVM 將提供更多有意義的信息,以便跟蹤確切的故障點(diǎn)

英文原文:

https://medium.com/swlh/working-with-new-generation-of-java-236e2dc38316

本文轉(zhuǎn)載自微信公眾號(hào)「高可用架構(gòu)」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系高可用架構(gòu)公眾號(hào)。


文章名稱:你可能未曾使用的新Java特性
轉(zhuǎn)載來于:http://www.dlmjj.cn/article/cojpcej.html