博客
关于我
Java 14 发布!不使用"class"也能定义类了?还顺手要干掉Lombok!
阅读量:272 次
发布时间:2019-03-01

本文共 3086 字,大约阅读时间需要 10 分钟。

JDK 14 新特性解析:Records 和 Switch Expressions

JDK 14 于 2020 年 3 月 17 日正式发布,引入了多项新特性,其中 Records 和 Switch Expressions(SE)是备受关注的亮点。以下将深入探讨这两大特性的实现原理、用法及应用场景。


JEP 359: Records

Records(记录)是一种紧凑的语法,用于定义类以存储和公开数据。传统上,创建这样的类需要编写大量冗长的代码,包括字段、构造函数、 getter/setter 方法、 equals、 hashCode 方法等。Records 的目标是简化这一过程,让开发者能够轻松创建纯数据载体类。

Records 的特点

  • 语法简洁:类可以通过一行代码定义,例如:

    record Person(String firstName, String lastName) {}

    这相当于传统的类定义,但省去了许多冗余代码。

  • 不可变数据:Records 类默认是不可变的,字段不能被修改。这样可以避免一些常见的错误,例如 null 显性。

  • 自动生成方法:Records 类会自动生成 hashCode、equals、toString 方法,这些方法基于字段的值进行计算,减少了手动编写的工作量。

  • 支持静态字段和方法:可以在 Records 类中添加静态字段和方法,但这些方法不会影响类的单一性,适用于特定场景。

  • Records 的用法示例

  • 简单的记录类

    record Person(String name, int age) {}

    这个类可以存储一个人的姓名和年龄,无需额外的 getter 方法。

  • 复杂的记录类

    record Employee(
    String firstName,
    String lastName,
    int age,
    Date hireDate
    ) {}

    这个类包含多个字段,适用于需要存储多个属性的场景。

  • 静态方法

    record Person {
    static int getPopulation() {
    return 2023;
    }
    }
  • 自定义构造函数

    record Person(String name, int age) {
    Person(String fullName) {
    this(fullName.split(" ")[0], this(fullName.split(" ")[1]));
    }
    }

    这样可以根据全名生成首字母和姓氏。


  • JEP 361: Switch Expressions(SE)

    Switch Expressions 是 JDK 14 中的另一大特性,扩展了 switch 语句的用法,使其既可以作为语句,也可以作为表达式。这种变化极大地简化了多条件判断的逻辑。

    Switch Expressions 的特点

  • 支持多种语法

    • 传统语法
      switch (day) {
      case MONDAY: case FRIDAY: case SUNDAY:
      System.out.println(6);
      break;
      case TUESDAY:
      System.out.println(7);
      break;
      case THURSDAY: case SATURDAY:
      System.out.println(8);
      break;
      case WEDNESDAY:
      System.out.println(9);
      break;
      }
    • 新语法
      switch (day) {
      case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);
      case TUESDAY -> System.out.println(7);
      case THURSDAY, SATURDAY -> System.out.println(8);
      case WEDNESDAY -> System.out.println(9);
      }
  • 支持表达式形式

    int numLetters = switch (day) {
    case MONDAY, FRIDAY, SUNDAY -> 6;
    case TUESDAY -> 7;
    case THURSDAY, SATURDAY -> 8;
    case WEDNESDAY -> 9;
    };

    这种形式更适合表达式为值的场景。

  • 新的控制语句

    • break:用于 switch 语句。
    • yield:用于 switch 表达式,返回一个值。
  • 默认值和异常处理

    • 必须确保所有可能值都有对应的 case,否则默认值会自动插入。
    • 可以在 case 中抛出异常,提升灵活性。
  • Switch Expressions 的应用场景

  • 多条件判断

    String result = switch (userInput) {
    case "read" -> "正在读取文件";
    case "write" -> "正在写入文件";
    default -> "未识别的操作";
    };
  • 表达式逻辑

    int score = switch (examType) {
    case "数学" -> 90;
    case "英语" -> 80;
    default -> 0;
    };
  • 异常处理

    String result = switch (input) {
    case "exit" -> {
    yield null;
    }
    default -> {
    throw new IllegalStateException("输入错误");
    }
    };

  • JDK 14 的其他新特性

    除了 Records 和 Switch Expressions,JDK 14 还引入了多项其他特性,例如:

    • Pattern Matching for instanceof(JEP 305):简化 instanceof 运算符的使用,支持模式匹配。
    • NUMA-Aware Memory Allocation for G1(JEP 345):优化 G1 垃圾回收器的性能,适用于大型 NUMA 机器。
    • ZGC on macOS 和 Windows(JEP 364, 365):将 ZGC 垃圾回收器移植到 macOS 和 Windows。

    Kotlin 的优势

    虽然本文主要介绍 Java 的新特性,但 Kotlin 作为 Java 的现代化补充语言,逐渐成为开发者青睐的选择。其语法简洁、安全性强、可读性高的特点,使其在现代应用开发中占据重要地位。


    总结

    JDK 14 引入的 Records 和 Switch Expressions 等特性,显著提升了 Java 的开发效率和代码质量。Records 通过简化纯数据类的定义,为开发者节省了大量手动编写代码的时间,而 Switch Expressions 的扩展则让多条件判断更加直观和简洁。这些特性预示着 Java 在未来版本中将更加注重简洁性和现代化,迎来新的发展机遇。

    转载地址:http://glma.baihongyu.com/

    你可能感兴趣的文章
    mysql中的 +号 和 CONCAT(str1,str2,...)
    查看>>
    Mysql中的 IFNULL 函数的详解
    查看>>
    mysql中的collate关键字是什么意思?
    查看>>
    MySql中的concat()相关函数
    查看>>
    mysql中的concat函数,concat_ws函数,concat_group函数之间的区别
    查看>>
    MySQL中的count函数
    查看>>
    MySQL中的DB、DBMS、SQL
    查看>>
    MySQL中的DECIMAL类型:MYSQL_TYPE_DECIMAL与MYSQL_TYPE_NEWDECIMAL详解
    查看>>
    MySQL中的GROUP_CONCAT()函数详解与实战应用
    查看>>
    MySQL中的IO问题分析与优化
    查看>>
    MySQL中的ON DUPLICATE KEY UPDATE详解与应用
    查看>>
    mysql中的rbs,SharePoint RBS:即使启用了RBS,内容数据库也在不断增长
    查看>>
    mysql中的undo log、redo log 、binlog大致概要
    查看>>
    Mysql中的using
    查看>>
    MySQL中的关键字深入比较:UNION vs UNION ALL
    查看>>
    mysql中的四大运算符种类汇总20多项,用了三天三夜来整理的,还不赶快收藏
    查看>>
    mysql中的字段如何选择合适的数据类型呢?
    查看>>
    MySQL中的字符集陷阱:为何避免使用UTF-8
    查看>>
    mysql中的数据导入与导出
    查看>>
    MySQL中的时间函数
    查看>>