自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

你可能未曾使用的新 Java 特性

開發(fā) 后端
Java 是在過去 20 年中一直在市場流行的編程語言。但是最近幾年各種替代 Java 的聲音不斷。

[[353173]]

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

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

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

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

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

1 Try-with-resource 語句

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

我們可以在 try 括號內(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(); 

新語法

  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(); 

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

2 switch 表達式

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

舊語法

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

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

新語法

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

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

3 用 var 初始化

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

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

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

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

4 記錄 (record)

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

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

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

像這樣的標準對象的調(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.  
  9.     public FXOrderClassic(int units, 
  10.                           CurrencyPair pair, 
  11.                           Side side, 
  12.                           double price, 
  13.                           LocalDateTime sentAt, 
  14.                           int ttl) { 
  15.         this.units = units; 
  16.         this.pair = pair; // CurrencyPair is a simple enum 
  17.         this.side = side; // Side is a simple enum 
  18.         this.price = price; 
  19.         this.sentAt = sentAt; 
  20.         this.ttl = ttl; 
  21.     } 
  22.  
  23.     public int units() { 
  24.         return units; 
  25.     } 
  26.  
  27.     public CurrencyPair pair() { 
  28.         return pair; 
  29.     } 
  30.  
  31.     public Side side() { 
  32.         return side; 
  33.     } 
  34.  
  35.     public double price() { return price; } 
  36.  
  37.     public LocalDateTime sentAt() { 
  38.         return sentAt; 
  39.     } 
  40.  
  41.     public int ttl() { 
  42.         return ttl; 
  43.     } 
  44.  
  45.     @Override 
  46.     public boolean equals(Object o) { 
  47.         if (this == o) return true
  48.         if (o == null || getClass() != o.getClass()) 
  49.             return false
  50.  
  51.         FXOrderClassic that = (FXOrderClassic) o; 
  52.  
  53.         if (units != that.units) return false
  54.         if (Double.compare(that.price, price) != 0) 
  55.             return false
  56.         if (ttl != that.ttl) return false
  57.         if (pair != that.pair) return false
  58.         if (side != that.side) return false
  59.         return sentAt != null ? 
  60.                 sentAt.equals(that.sentAt) : that.sentAt == null
  61.     } 
  62.  
  63.     @Override 
  64.     public int hashCode() { 
  65.         int result; 
  66.         long temp
  67.         result = units; 
  68.         result = 31 * result + 
  69.                 (pair != null ? pair.hashCode() : 0); 
  70.         result = 31 * result + 
  71.                 (side != null ? side.hashCode() : 0); 
  72.         temp = Double.doubleToLongBits(price); 
  73.         result = 31 * result + 
  74.                 (int) (temp ^ (temp >>> 32)); 
  75.         result = 31 * result + 
  76.                 (sentAt != null ? sentAt.hashCode() : 0); 
  77.         result = 31 * result + ttl; 
  78.         return result; 
  79.     } 
  80.  
  81.     @Override 
  82.     public String toString() { 
  83.         return "FXOrderClassic{" + 
  84.                 "units=" + units + 
  85.                 ", pair=" + pair + 
  86.                 ", side=" + side + 
  87.                 ", price=" + price + 
  88.                 ", sentAt=" + sentAt + 
  89.                 ", ttl=" + ttl + 
  90.                 '}'
  91.     } 

新語法

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

5 增強的 instance of

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

舊語法

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

新語法

  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.  
  9.     return null

6 文本塊

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

舊語法

  1. String html = "<HTML>" + 
  2. "\n\t" + "<BODY>" + 
  3. "\n\t\t" + "<H2>\"Hurray! Java 14 is here\"</H2>" + 
  4. "\n\t" + "</BODY>" + 
  5. "\n" + "</HTML>"

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

新語法

  1. String html = ""
  2. <HTML> 
  3.   <BODY> 
  4.     <H2>"Hurray! Java 14 is here"</H2> 
  5.   </BODY> 
  6. </HTML> 
  7. """; 

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

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

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

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

在代碼段中,可能存在多個故障點,例如

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

但以下 NPE 報錯未提供有關(guān)該問題的足夠詳細信息。

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

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

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

-XX:+ShowCodeDetailsInExceptionMessages

使用該標志,JVM 將提供更多有意義的信息,以便跟蹤確切的故障點

英文原文:

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

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

 

責(zé)任編輯:武曉燕 來源: 高可用架構(gòu)
相關(guān)推薦

2019-11-05 16:51:41

JavaScript數(shù)據(jù)es8

2019-03-04 09:39:41

Java開發(fā)代碼

2025-01-30 00:00:00

API指令集計算能力

2013-10-21 17:57:54

2022-01-17 22:33:37

Java特定類型

2012-03-24 21:02:41

iOS

2015-06-29 09:40:10

Rails新特性

2014-08-21 10:34:11

Java 9Java

2021-02-22 11:51:15

Java開發(fā)代碼

2024-11-19 10:26:35

2014-07-15 14:48:26

Java8

2020-09-17 13:10:54

Java1編程語言新特性

2017-11-22 09:57:22

HTML5存儲代碼

2015-08-28 09:43:49

Java 8新特性處理集合

2020-11-16 12:09:25

Python開發(fā)工具

2023-04-09 23:37:31

JavaScript開發(fā)

2022-03-09 08:14:24

CSS容器container

2021-10-12 07:15:03

C++20特性

2011-12-14 16:15:17

MySQL

2020-04-26 10:52:37

LinuxUbuntu 20.0Ubuntu 18.0
點贊
收藏

51CTO技術(shù)棧公眾號