Java 14 有了这几个新特性,开发直接飞起来!

qiaohhgz 2020-11-06 19:48:05 ⋅ 1050 阅读

内容介绍:

  1. Record -- 简化了简单 Java 类的创建。
  2. Pattern Matching -- 简化了 instanceof 。
  3. Switch 表达式 -- 简化了 switch 语句。
  4. NullPointerException -- 提供了精准的 NULL 信息。

1. Record

比如说你要创建一个 Student 类,包括属性 id、name,都需要做什么?大概步骤如下:

  • 创建一个 Student Class
  • 定义所需的属性
  • 定义构造方法
  • getter()/setter()
  • 覆写 toString()
  • 覆写 equals()
  • 覆写 hashCode()

示例代码:

public class Student{
    private int id;
    private String name;

    public Student(){
      ...
    }
  
    public int getId(){
      ...
    }
  
    // ... 其他 getter()/setter()
  
    public boolean equals(Student s) {
      ...
    }
  
    public int hashCode() {
      ...
    }
    public String toString() {
      ...
    }
}

这是不是很麻烦,就是定义一个非常简单的类,却需要做这么多事儿。

有了 Record 之后就简单了:

record Student(int id, int name) { }

只需要一行代码,上述那些冗长的代码会由 Java 帮我们自动生成。

Record 定义的是一个 final class,不可变,其中的属性也一样,所以不会有 setter 方法。

getter 也并不需要使用 getXXX,直接使用属性名即可。

2. Pattern Matching

先看传统的 instanceof 用法:

public void attendTo(Animal a) {
  if (a instanceof Dog) {
    walk((Dog)a);
  } else if (a instanceof Cat) {
    cleanLitterBoxOf((Cat)a);
  } else {
    returnToStore(a);
  }
}

再看新用法:

public void attendTo(Animal a) {
  if (a instanceof Dog d) {
    walkDog(d);
  } else if (a instanceof Cat a) {
    cleanLitterBoxOf(a);
  } else {
    returnToStore(a);
  }
}

看到区别了吧,在检查类型的同时,可以定义一个变量,下面就可以直接使用了,不用再手动转型了。

3. Switch 表达式

之前 Switch 是一个流程控制语句,而在 Java 14 中,Switch 还可以作为一个表达式来使用。

传统用法:

int i = -1;
String s = ...;
switch (s) {
  case "none":
    i = 0;
    break;
  case "one":
    i = 1;
    break;
  default:
    i = 2;
}

新用法:

int i = ...
String s = switch (i) {
  case 0 -> "none";
  case 1 -> "one";
  default -> "many;
}

再举个例子:

int days = 0;
switch (month) {
    case 1:
    case 3:
    case 5:
    case 7:
    case 8:
    case 10:
    case 12:
        days = 31;
        break;
    case 4:
    case 6:
    case 9:
        days = 30;
        break;
    case 2:
        days = 28;
        break;
    default:
        throw new IllegalArgumentException("Invalid month");
}

新用法:

int days = switch (month) {
        case 1, 3, 5, 7, 8, 10, 12 -> 31;
        case 4, 6, 9 -> 30;
        case 2 -> 28;
        default -> 0;
};

4. NullPointerException

NullPointerException 空指针异常是很常见的,但是其异常信息并不明确。

例如下面的代码:

String emailAddress = employee
  .getPersonalDetails()
  .getEmailAddress()
  .toLowerCase();

如果出现了空指针,异常信息是这样的:

Exception in thread "main" java.lang.NullPointerException
  at xxx.HelpfulNullPointerException.main(xxx.java:10)

(代码框显示不全,可以横向滑动)

异常信息中只告诉你这一行代码出现了空指针,但是,到底是 getPersonalDetails() 还是 getEmailAddress() 呢?只能自己分析了。

Java 14 对 NullPointerException 进行了优化,异常信息会是这样的:

Exception in thread "main" java.lang.NullPointerException: 
  Cannot invoke "String.toLowerCase()" because the return value of 
"xxx.HelpfulNullPointerException$PersonalDetails.getEmailAddress()" is null
  at xxx.HelpfulNullPointerException.main(xxx.java:10)

(代码框显示不全,可以横向滑动)

从中可以明确知道是 getEmailAddress() 为空,这样就方便多了。

Happy Learning … :-)

参考资料:

https://levelup.gitconnected.com/the-real-potential-in-java-14s-records-dd42a24dc739

https://www.baeldung.com/java-14-nullpointerexception

https://www.codejava.net/java-core/the-java-language/switch-expression-examples


全部评论: 0

    我有话说:

    GitHub精选:2018年11月份最热门的Java开源项目

    又到揭晓 11 月份最热门 Java 开源项目排名的时候,在本月的名单中,出现面孔,如Java 核心知识库、轻量级容错组件Resilience4j .....

    Java 实战篇-JDK9特性体验

    JDK9 已经出来好几,我们一起来了解一下JDK9的一些特性

    Spring Boot 2.1.0特性 ,准备好吗?!

    Spring Boot官方在10月30号正式发布v2.1.0.RELEASE版本,由于本人最近比较忙,直到今天才着重抽空学习和了解次升级一共带来9大特性,根据官方描述,正在逐渐支持 java

    微型Java开发框架Solon 1.1发布,QPS达10万+

    简介 Solon 是一个微型的Java开发框架。项目从2018年启动以来,参考过大量前人作品;历时两年,2700多次的commit;内核保持0.1m的身材,超高的Web跑分,良好的使用体验

    【收藏】18 Java8 日期处理的实践,太

    来源:https://juejin.im/post/5a795bad6fb9a0634f407ae5 Java 8 日期处理 Java 8 推出全新的日期时间API,在教程中我们将通过一些简单的

    JDK 16 即将发布,特性速览!

    8 版本之际,这边下一版本 Java 16 ...

    Google 宣布正式开源 Jib ,帮助 Java 应用快速容器化

    Google 本周宣布开源一款Java 工具 Jib ,旨在让开发者使用他们熟悉的工具更轻松地将 Java 应用程序容器化。

    Java 零注解文档生成工具—smart-doc,看完替换swagger的冲动

    Tips:喜欢的话可以关注小萌哦~~~今天小萌给大家推荐的一个开源Java Restful API 文档生成

    Java Web实战篇:发布和运维必备的12条Linux命令

    作为一名Java起步的从业人员,学会一些常用的Linux命令是必须的。

    Bootstrap 图标集 v1.2.0 发布-包含数十图标

    我们最新的 Bootstrap Icons 发布版包含数十图标、重新设计的文档和呼声最高的特性 —— 图标字体! 的社交网络图标 我们的社交图标工作一开始比较慢 —— 人们可能只

    为什么要使用 Node.js?点你必须知道!

    经过年的发展,前端普遍进入技术深水区,只会Web页面开发已经难以满足企业的需求,Node逐渐成为刚性技能。 但Node在业务上的使用还没有那么普及,有的时候想用老板还不同意,本文将从4角度

    微信开发神器全能微信Java开发工具包

    必须分享的微信神器 weixin-java-tools

    开源资讯」Guava 28.2 发布,Google 的 Java 核心工具库

    前言 Guava 28.2 发布,Guava 是 Google 的一个开源项目,包含许多 Google 核心 Java 常用库,如:集合 [collections] 、缓存 [caching

    JDK11即将来临,特性了解一下

    预计 JDK 11 将于 9 月 25 日正式发布,可用于正常使用。

    精品推荐:11高人气Javascript动画库

    翻译 | 小生 来源 | https://www.zcfy.cc/article/11-javascript-animation-libraries-for-2018

    精品推荐:一览GitHub上最受程序欢迎的5大Java开源项目

    列举GitHub上一些最流行的Java项目。从Mockitos到Guava,以及 java-design-patterns等供大家学习。

    小程序开源框架汇总,你知道

    想要开发出一套高质量的小程序,运用框架?看过来

    蚂蚁金服 Java RPC 开源框架—SOFARPC

    SOFARPC 是一个高可扩展性、高性能、生产级的 Java RPC 框架。