前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java 14 有了这几个新特性,开发更方便了

Java 14 有了这几个新特性,开发更方便了

作者头像
dys
发布2020-11-13 14:36:29
3800
发布2020-11-13 14:36:29
举报
文章被收录于专栏:性能与架构

内容介绍:

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

示例代码:

代码语言:javascript
复制
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 之后就简单了:

代码语言:javascript
复制
record Student(int id, int name) { }

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

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

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

2. Pattern Matching

先看传统的 instanceof 用法:

代码语言:javascript
复制
public void attendTo(Animal a) {
  if (a instanceof Dog) {
    walk((Dog)a);
  } else if (a instanceof Cat) {
    cleanLitterBoxOf((Cat)a);
  } else {
    returnToStore(a);
  }
}

再看新用法:

代码语言:javascript
复制
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 还可以作为一个表达式来使用。

传统用法:

代码语言:javascript
复制
int i = -1;
String s = ...;
switch (s) {
  case "none":
    i = 0;
    break;
  case "one":
    i = 1;
    break;
  default:
    i = 2;
}

新用法:

代码语言:javascript
复制
int i = ...
String s = switch (i) {
  case 0 -> "none";
  case 1 -> "one";
  default -> "many;
}

再举个例子:

代码语言:javascript
复制
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");
}

新用法:

代码语言:javascript
复制
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 空指针异常是很常见的,但是其异常信息并不明确。

例如下面的代码:

代码语言:javascript
复制
String emailAddress = employee
  .getPersonalDetails()
  .getEmailAddress()
  .toLowerCase();

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

代码语言:javascript
复制
Exception in thread "main" java.lang.NullPointerException
  at xxx.HelpfulNullPointerException.main(xxx.java:10)

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

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

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

代码语言:javascript
复制
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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-11-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 JAVA高性能架构 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. Record
  • 2. Pattern Matching
  • 3. Switch 表达式
  • 4. NullPointerException
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档