文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

不要错过的六个优秀Java新功能

2024-12-02 19:50

关注

【51CTO.com快译】随着采用新的发布节奏,Java在2018年悄然经历了其开发过程中最大的变化之一。而这个大胆的新计划导致Java的开发人员每六个月发布一个新功能。

这有利于保持Java的新鲜度和相关性,但它很容易让开发人员错过引入的功能。本文汇总了几个有用的新功能并对其进行概述。

1.可选类(Optional class)

空指针异常是所有错误中最经典的错误之一。虽然开发人员可能很熟悉这个问题,但它的处理过程非常冗长,需要加以防范。至少在Java 8(以及Java 10改进)引入可选类之前是这样。

本质上,可选类允许包装一个变量,然后使用包装器的方法更简洁地处理空值。

清单1有一个多样性空指针错误的示例,其中的可选类引用foo为空(null),并且在其上访问了一个方法foo.getName()。

清单1.没有可选类的空指针

  1. public class MyClass { 
  2.     public static void main(String args[]) { 
  3.       InnerClass foo = null
  4.       System.out.println("foo = " + foo.getName()); 
  5.     } 
  6. class InnerClass { 
  7.   String name = ""
  8.   public String getName(){ 
  9.       return this.name
  10.   } 

可选类提供了多种处理此类情况的方法,具体取决于开发人员的需要。它运行一个isPresent()方法,开发人员可以使用它来进行if检查。然而这个过程可能相当冗长。但是可选类也有函数处理的方法。例如,清单2展示了如何使用ifPresent()——注意与isPresent()的一个字母差异,只有当存在数值时才运行输出代码。

清单2.只有当存在数值时运行代码

  1. import java.util.Optional; 
  2. public class MyClass { 
  3.     public static void main(String args[]) { 
  4.       InnerClass foo = null; //new InnerClass("Test"); 
  5.       Optional fooWrapper = Optional.ofNullable(foo); 
  6.       fooWrapper.ifPresent(x -> System.out.println("foo = " + x.getName())); 
  7.       //System.out.println("foo = " + fooWrapper.orElseThrow()); 
  8.     } 
  9. class InnerClass { 
  10.   String name = ""
  11.   public InnerClass(String name){ 
  12.       this.name = name
  13.   } 
  14.   public String getName(){ 
  15.       return this.name
  16.   } 

提示:当使用可选类时,如果使用orElse()方法通过方法调用提供默认值,需要考虑如果该值是非空的话,使用orElseGet()来提供函数引用,以获得不运行调用的性能优势。

2.记录类(预览功能)

构建Java应用程序的一个常见需求是所谓的不可变DTO(数据传输对象)。DTO用于对来自数据库、文件系统和其他数据存储的数据进行建模。传统上,DTO是通过创建一个类来创建的,该类的成员通过构造函数设置,没有getter方法来访问它们。Java 14引入并改进了Java 15,新的记录关键字为此目的提供了速记。

清单3说明了引入记录类型之前的典型DTO定义和用法。

清单3.一种简单的不可变DTO

  1. public class MyClass { 
  2.     public static void main(String args[]) { 
  3.       Pet myPet = new Pet("Sheba", 10); 
  4.  
  5.       System.out.println(String.format("My pet %s is aged %s", myPet.getName(), myPet.getAge())); 
  6.     } 
  7. class Pet { 
  8.     String name
  9.     Integer age; 
  10.     public Pet(String nameInteger age){ 
  11.         this.name = name
  12.         this.age = age; 
  13.     } 
  14.     public String getName(){ 
  15.         return this.name
  16.     } 
  17.     public Integer getAge(){ 
  18.         return this.age; 
  19.     } 

可以使用记录关键字消除大部分样板文件,如清单4所示。

清单4.使用记录关键字

  1. public class MyClass { 
  2.     public static void main(String args[]) { 
  3.       Pet myPet = new Pet("Sheba", 10); 
  4.  
  5.       System.out.println(String.format("My pet %s is aged %s", myPet.getName(), myPet.getAge())); 
  6.     } 
  7.  
  8. public record Pet(String nameInteger age) {} 

需要注意的是,使用数据对象的客户端代码没有改变;它的行为就像一个传统定义的对象。记录关键字足够智能,可以通过简单的定义足迹推断出存在哪些字段。

记录类还定义了equals()、hashCode()和toString()的默认实现,同时还允许开发人员覆盖这些实现。开发人员还可以提供自定义构造函数。

需要注意的是,记录不能被子类化。

3.新字符串方法

在Java 10和Java 12中,添加了几个有用的新字符串方法。除了字符串操作方法之外,还引入了两种用于简化文本文件访问的新方法。

Java 10中的新字符串方法:

Java 12中的新字符串方法:

清单5. String.lines() 示例

  1. import java.io.IOException; 
  2. import java.util.stream.Stream; 
  3. public class MyClass { 
  4.     public static void main(String args[]) throws IOException{ 
  5.       String str = "test \ntest2 \n\rtest3 \r"
  6.       Stream lines = str.lines(); 
  7.       lines.forEach(System.out::println); 
  8.     } 
  9.  
  10.  

清单6.String.readString(Path path)示例

  1. Path path = Path.of("myFile.txt");  
  2. String text = Files.readString(path); 
  3. System.out.println(text); 

4.Switch表达式

Java 12引入了Switch表达式,它允许在语句中内联使用Switch。换句话说,Switch表达式返回一个值。Java 12还提供了一种箭头语法,无需显式中断即可防止失败。Java 13则更进一步改进,引入了yield关键字来明确表示Switch case返回的值。Java 14采用了新的Switch表达式语法作为完整功能。

让我们看一些例子。首先,清单7有一个传统格式(Java 8)的Switch语句示例。此代码使用变量(消息)输出已知数字的名称。

清单7.传统Java Switch

  1. class Main {  
  2.   public static void main(String args[]) { 
  3.     int size = 3; 
  4.     String message = ""
  5.  
  6. switch (size){ 
  7.  case 1 : 
  8. message = "one"
  9.  case 3 : 
  10.    message = "three"
  11. break; 
  12.  default : 
  13. message = "unknown"
  14. break; 
  15.  
  16. System.out.println("The number is " + message); 
  17.   } 

现在这段代码非常冗长并且挑剔。其实里面已经有了错误,开发人员需要仔细查找丢失的内容。清单8通过使用新Switch表达式进行了简化。

清单8. 新的Switch表达式

  1. class NewSwitch {  
  2.   public static void main(String args[]) { 
  3.     int size = 3; 
  4.  
  5.     System.out.println("The number is " + 
  6.       switch (size) { 
  7.         case 1 -> "one"
  8.         case 3 -> "three"
  9.         default -> "unknown"
  10.       } 
  11.     ); 
  12.   } 

在清单8中,可以看到Switch表达式就在System.out.println调用中。这已经是一个很大的可读性胜利,并且消除了多余的消息变量。此外,箭头语法通过消除break语句减少了代码占用空间。(不使用箭头语法时使用yield关键字。)

5.文本块

Java 13通过引入文本块解决了在Java中处理复杂文本字符串的长期困扰。Java 14改进了这种支持。

JSON、XML和SQL之类的东西可能会让开发人员过多地使用多个嵌套的转义层。正如规范解释的那样:“在Java中,在字符串文字中嵌入HTML、XML、SQL或JSON的片段……通常需要使用转义和连接进行大量编辑,然后才能编译包含该片段的代码。该代码段通常难以阅读且难以维护。”

在清单9中,新的文本块语法用于创建JSON片段。

清单9.使用文本块的JSON

  1. class TextBlock {  
  2.   public static void main(String args[]) { 
  3.     String json = ""
  4.       { 
  5.         "animal" : "Quokka"
  6.         "link" : "https://en.wikipedia.org/wiki/Quokka" 
  7.       } 
  8.     """; 
  9.  
  10.     System.out.println(json); 
  11.   } 

在清单9中看不到转义字符。此外,还要注意三重双引号语法。

6.密封类

Java 15(JEP 260)引入了密封类的概念。简而言之,新的sealed关键字允许开发人员定义哪些类可以对接口进行子类化。在这种情况下,示例胜过千言万语。参见清单10。

清单10.密封类示例

  1. public abstract sealed class Pet 
  2.     permits Cat, Dog, Quokka {...} 

界面设计者在这里使用了sealed关键字来指定允许哪些类扩展Pet类。

总的来说,很明显,Java发布功能的新方法正在奏效。人们看到许多新想法通过JEP(JDK增强提案)过程转化为实际可用的Java功能。这对Java开发人员来说是一个好消息。这意味着他们正在使用一种充满活力、不断发展的语言和平台。

原文6 great new Java features you don’t want to miss,作者:Matthew Tyson

【51CTO译稿,合作站点转载请注明原文译者和出处为51CTO.com】

 

来源:51CTO内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯