目录

一、JAVA5~11(图片版)

二、JAVA12~17(文字版)

开关表达式

文本块

打包工具

Instanceof 的模式匹配

记录

密封类


一、JAVA5~11(图片版)

二、JAVA12~17(文字版)

参考:从 Java 12 到 17 的新特性 | w3c笔记

Java 11(迄今为止的最后一个长期支持版本)三年后,Java 17 LTS 将于 2021 年 9 月发布。是时候快速浏览一下开发人员从 11 升级到 17 后可以享受的新功能了。请注意,在幕后进行了更多改进。本文重点介绍大多数开发人员可以直接使用的功能:

  • 开关表达式 ( JEP 361 )
  • 文本块 ( JEP 378 )
  • 封装工具 ( JEP 392 )
  • instanceof 的模式匹配(JEP 394)
  • 记录 ( JEP 395 )
  • 密封类 ( JEP 409 )

开关表达式

switch 现在可以返回一个值,就像一个表达式:

// 将给定 planet 的 group 分配给一个变量
String group = switch(planet){case MERCURY, VENUS, EARTH, MARS -> "内行星";case JUPITER, SATURN, URANUS, NEPTUNE -> "外行星";
}

如果单个 case 的右侧需要更多代码,则可以将其写入块中,并使用yield以下方法返回值:

// 打印给定 planet 的 group,以及更多信息
// 并将给定 planet 的 group 分配给一个变量
String group = switch(planet){case EARTH, MARS -> {System.out.println("内行星");System.out.println("主要由岩石组成");yield "内部的";}case JUPITER, SATURN -> {System.out.println("外行星");System.out.println("主要由气体组成");yield "外部的";}
}

但是,使用新的箭头标签进行切换不需要返回值,就像 void 表达式一样:

// 打印给定 planet 的 group
// 不返回任何东西
switch(planet){case EARTH, MARS -> System.out.println("内行星");case JUPITER, SATURN -> System.out.println("外行星");
}

与传统的 switch 相比,新的 switch 表达式

  • 使用“->”代替“:”
  • 每个案例允许多个常量
  • 没有贯穿语义(即,不需要中断)
  • 使在 case 分支中定义的变量本地化到这个分支

此外,编译器保证了 switch 的详尽性,因为只有一种情况被执行,这意味着要么

  • 所有可能的值都被列为案例(如上面的枚举由八个行星组成)
  • 必须提供“默认”分支

文本块

文本块允许编写包含双引号的多行字符串,而无需使用\n\"转义序列:

String block = """可以输入多行文本内容可以缩进可以带有“双引号”!
"""

文本块由三个双引号"""和一个换行符打开,并由三个双引号关闭。

Java 编译器应用智能算法从结果字符串中去除前导空格,使得

  • 删除了仅与更好的 Java 源代码可读性相关的缩进
  • 与字符串本身相关的缩进保持不变

在上面的示例中,结果字符串如下所示,其中每个都.标记一个空格:

..可以输入多行文本内容
....可以缩进
......可以带有“双引号”!

想象一个跨越文本块高度的垂直条,从左到右移动并删除空格,直到它接触到第一个非空格字符。结束文本块分隔符也很重要,因此将其向左移动两个位置。

String block = """可以输入多行文本内容可以缩进可以带有“双引号”!
"""

结果在以下字符串中:

可以输入多行文本内容
..可以缩进
....可以带有“双引号”!

此外,每一行的尾随空格都会被删除,这可以通过使用新的转义序列来防止\s

文本块内的换行符可以转义:

String block = """请 \不要 \插队 \, \谢谢 \
"""

结果在以下字符串中,没有任何换行符:

请.不要.插队.,.谢谢

或者,也可以通过将结束定界符直接附加到字符串的末尾来删除最后的换行符

String block = """没有最终的断线在这个字符串的末端"""

将变量插入文本块可以像往常一样使用静态方法String::format或新的实例方法String::formatted来完成,写起来要短一些:

String block ="""%s 标记位置.""".formatted("x");

打包工具

假设您demo.jarlib目录中有一个 JAR 文件,以及其他依赖项 JAR。以下命令

jpackage --name demo --input lib --main-jar demo.jar --main-class demo.Main

将此演示应用程序打包为与您当前平台相对应的本机格式:

  • Linux:deb 或 rpm
  • Windows:msi 或 exe
  • macOS:pkg 或 dmg

生成的包还包含运行应用程序所需的 JDK 部分以及本机启动器。这意味着用户可以以特定于平台的标准方式安装、运行和卸载应用程序,而无需事先明确安装 Java。

不支持交叉编译:如果需要 Windows 用户的包,必须在 Windows 机器上用 jpackage 创建。

可以使用更多选项自定义包创建,这些选项记录在jpackage 手册页上。

Instanceof 的模式匹配

模式匹配instanceof消除了在类型比较后执行强制转换的样板代码:

Object o = "字符串伪装成对象";
if (o instanceof String s){System.out.println(s.toUppperCase());
}

在上面的示例中,新变量的范围s直观地限于if分支。准确地说,变量在保证模式匹配的范围内,这也使以下代码有效:

if (o instanceof String s && !s.isEmpty()){System.out.println(s.toUpperCase());
}

反之亦然

if (!(o instanceof String s)){throw new RuntimeException("excepting string");
}
// s 在此范围内!
System.out.println(s.toUpperCase());

记录

记录减少了作为简单数据载体的类的样板代码:

record Point(int x, int y) { }

这个单行产生一个自动定义的记录类

  • x 和 y 的字段(私有和最终)
  • 所有字段的规范构造函数
  • 所有领域的​Getters
  • equals​, ​hashCode​, 和​toString​(考虑所有字段)
// 规范构造函数
Point p = new Point(1, 2);
// getters - 没有'get'前缀
p.x();
p.y();// equals, hashCode, toString
p.equals(new Point(1, 2)); // true
p.hashCode(); // 依赖于x和y的值
p.toString(); // Point[x=1,y=2] 

记录类的一些最重要的限制是它们

  • 是不可变的(因为它们的字段是私有的和最终的)
  • 是隐式最终的
  • 无法定义其他实例字段
  • 总是扩展​Record​类

然而,也可以:

  • 定义其他方法
  • 实现接口
  • 自定义规范构造函数和访问器
record Point(int x, int y) {// 显示规范构造函数Point {// 自定义验证if (x < 0 || y < 0) throw new IllegalArgumentException("no negative points allowed");// 自定义调整(通常违背直觉)x += 1000;y += 1000;// 对字段的赋值在最后自动法僧}// 显示访问器public int x() {// 自定义的代码return this.x;}
}

此外,可以在方法中定义本地记录:

public void withLocalRecord() {record Point(int x, int y) { };Point p = new Point(1, 2);
}

密封类

密封类明确列出允许的直接子类。其他类不得从此类扩展:

public sealed class Parentpermits ChildA, ChildB, ChildC { ... }

同样,密封接口明确列出允许的直接子接口和实现类:

sealed interface Parentpermits ChildA, ChildB, ChildC { ... }

列表中的类或接口permits必须位于同一个包中(如果父模块位于命名模块中,则位于同一个模块中)。

所述permits,如果亚类(或接口)位于同一文件内,可以省略列表:

public sealed class Parent {final class Child1 extends Parent {}final class Child2 extends Parent {}final class Child3 extends Parent {}
}

permits列表中的每个子类或接口都必须使用以下修饰符之一:

  • final(不允许进一步扩展;仅用于子类,因为接口不能是最终的)
  • 密封(允许进一步、有限的扩展)
  • 非密封(允许再次无限扩展)

java5至java17新特性总结(开发相关)相关推荐

  1. 开发者必看|Android 8.0 新特性及开发指南

    背景介绍 谷歌2017I/O开发者大会今年将于5月17-19日在美国加州举办.大会将跟往年一样发布最新的 Android 系统,今年为 Android 8.0.谷歌在今年3 月21日发布 Androi ...

  2. Spring4新特性——Web开发的增强

    2019独角兽企业重金招聘Python工程师标准>>> Spring4新特性--泛型限定式依赖注入 Spring4新特性--核心容器的其他改进 Spring4新特性--Web开发的增 ...

  3. AutoCAD 2014 新特性--针对开发人员

    首先你需要阅读AutoCAD 2014 产品的新特性,这里讲的是对于AutoCAD 2014开发人员来说有哪些新东西. AutoCAD 2014与AutoCAD 2013二进制兼容 原先基于AutoC ...

  4. Java17 新特性确定,Java之父:终于可以和一个长达25年的漏洞说再见了

    Java 17 目前已经进入Rampdown Phase One阶段,所有的功能特性都已经被冻结.这说明Java 17的新特性已经定了,不会再增加新的JEP(JDK增强建议).之所以关心Java 17 ...

  5. Android6.0新特性及开发指南(转载)

    本文通过翻译官方文档和google开发者大会资料收集得出,转载请注明出处. Android 6.0系统新特性及功能说明... 1 1       优化用户体验:... 1 1.1        应用权 ...

  6. Java17 新特性和改进

    Java 17 新特性和改进 Java 17 是 Java 编程语言和标准库的最新版本,是一个非常重要的更新.作为 Java 9 后的第 8 个长期支持版本(LTS),Java 17 带来了一系列有趣 ...

  7. Java8 ~ Java17 新特性

    Java 8 主要特性: Lambda, 函数式接口,方法引用,Optional, Stream的引入 接口默认方法,重复注解,日期API, Base64支持 Lambda和函数式接口 函数式接口就是 ...

  8. ios8新特性widget开发(手机上和通知栏并列的今天的制作)

    ios8发布已经有一段时间了,伴随着ios8同时也出现了许多新的特性,ios系统将会越来越开放,这是好事.其中一个新特性就是在下拉通知栏里加入了个性的widget,开发者可以自己定义widget的样式 ...

  9. Android N 新特性 + APP开发注意事项

    1. 多窗口MultiWindow 多窗口MultiWindow,这是Android N里对开发者影响比较大的特性,也是大家疑问比较多的地方.站在开发者的角度其实不必太担心这个特性会导致我们需要修改很 ...

最新文章

  1. centos5 db_load 命令无法使用
  2. Keycloak简单几步实现对Spring Boot应用的权限控制
  3. python如何爬虫网页数据-如何轻松爬取网页数据?
  4. freebsd 下安装桌面
  5. 红旗桌面版本最新运用要领和结果解答100例-3
  6. .NET7的七项重大改进!
  7. 数据压缩 第二次作业
  8. OpenCV学习笔记:视频处理
  9. JavaScript if(x),==和===解析(翻译整理)
  10. three.js 来源目光(十三)Math/Ray.js
  11. centos6 下安装xfce+vnc
  12. 开源项目推荐:3D点云处理软件ParaView,基于Qt和VTK
  13. 免费在线的redmine项目演示,提供免费三级域名
  14. 三国志战略版360区S4服务器合并信息,三国志战略版s3赛季服务器合并与规则一览...
  15. python音频 降噪_python降噪_python音频降噪_python图片降噪 - 云+社区 - 腾讯云
  16. 与NFC相关的几种卡片
  17. 【20保研】热忱欢迎全国2020届优秀本科毕业生免试攻读重庆大学研究生
  18. java计算机毕业设计喜枫日料店自助点餐系统源码+系统+数据库+lw文档+mybatis+运行部署
  19. Ajax传递数组到后台的两种方式
  20. 1024,程序员节!快乐!

热门文章

  1. 【JY】YJK前处理参数详解及常见问题分析(一)
  2. terminal 命令行 光标移动 行首 行尾
  3. 大学四年到阿里技术专家,我是怎么走过来的
  4. 02 C语言使用队列实现缓存模块QueueBuffer
  5. 搭建ngrok服务器
  6. 计算机应用基础0006 19春在线作业2,《计算机应用基础0006》19春在线作业 参考资料...
  7. PWM调光频率0.1-20KHz以内,共阳极控制高辉无频闪LED车灯调光电源驱动芯片方案FP7125/FP7122/FP7123
  8. Java Web应用开发_04javaWeb基础
  9. 在应急响应过程中,有什么好的方法可以寻找某一日期创建的文件?
  10. 安防工程商前期收集客户信息15种方法与详细流程