Java 14 开箱,它真香香香香

我会带着你远行 2021-09-10 08:52 468阅读 0赞

Java 14 已经发布有一周时间了,我准备来开个箱,和小伙伴们一起来看看新特性里面都有哪些好玩的。我们程序员应该抱着尝鲜、猎奇的心态,否则就容易固步自封,技术停滞不前。先来看看 Java 14 都有哪些新特性吧!

1179389-067a64fbef795410.png

红色线划出来的是我比较感兴趣的,其余的对我没什么太大的吸引力,就暂且略过。

01、下载 JDK 14

要想开箱,得先下载 JDK 14,不然拿什么开箱呢,对吧?有 2 处地方可供下载,Oracle 上可以下载商用版, jdk.java.net 上可以下载开源版。我们就选择后者吧。

1179389-2d3d70d884449501.png

我目前用的是 Windows 操作系统,所以就选择 Windows 版的 zip 包进行下载,完成后记得解压。

02、升级 IntelliJ IDEA

需要把 IDEA 升级到抢先体验版 2020.1 EAP,否则无法支持 Java 14 的新特性。

1179389-8ab1cbdb40720b3e.png

社区版的下载地址如下所示:

  1. [https://www.jetbrains.com/idea/nextversion/#section=windows](https://www.jetbrains.com/idea/nextversion/#section=windows)

安装的时候可以把之前的版本卸载,也可以选择保留。完成后,我们来新建一个 Java 14 的项目。

1179389-0aab0acbcdb39edb.png

01、instanceof

按照新特性的顺序,我们就先从 instanceof 说起吧。旧式的 instanceof 的用法如下所示:

  1. public class OldInstanceOf {
  2. public static void main(String[] args) {
  3. Object str = "Java 14,真香";
  4. if (str instanceof String) {
  5. String s = (String)str;
  6. System.out.println(s.length());
  7. }
  8. }
  9. }

需要先使用 instanceof 在 if 条件中判断 str 的类型是否为 String(第一步),再在 if 语句中将 str 强转为字符串类型(第二步),并且要重新声明一个变量用于强转后的赋值(第三步)。

三个步骤也不算多,但总觉得应该还有更好的语法,这不,Java 14 就想到了这一层。

  1. public class NewInstanceOf {
  2. public static void main(String[] args) {
  3. Object str = "Java 14,真香";
  4. if (str instanceof String s) {
  5. System.out.println(s.length());
  6. }
  7. }
  8. }

可以直接在 if 条件判断类型的时候添加一个变量,就不需要再强转和声明新的变量了。是不是特别简洁?但模式匹配的 instanceof 在 Java 14 中是预览版的,默认是不启用的,所以这段代码会有一个奇怪的编译错误(Java 14 中不支持模式匹配的 instanceof)。

1179389-85148ab7226fc8e5.png

那怎么解决这个问题呢?需要在项目配置中手动设置一下语言的版本。

1179389-7a31706069952f08.png

设置完成后,编译错误就随风飘走了。程序输出的结果如下所示:

  1. 10

不错不错,真香。想知道 Java 编译器在背后帮我们做了什么吗?看一下反编译后的字节码就明白了。

  1. public class NewInstanceOf {
  2. public NewInstanceOf() {
  3. }
  4. public static void main(String[] args) {
  5. Object str = "Java 14,真香";
  6. String s;
  7. if (str instanceof String && (s = (String)str) == (String)str) {
  8. System.out.println(s.length());
  9. }
  10. }
  11. }

在 if 条件判断前,先声明了变量 s,然后在 if 条件中进行了强转 s = (String)str),并且判断了 s 和 str 是否相等。确实是一个解放开放者生产力的好特性,强烈希望这个特性在下个版本中转正。

02、Records

在之前的一篇文章中,我谈到了类的不可变性,它是这样定义的:

  1. public final class Writer {
  2. private final String name;
  3. private final int age;
  4. public Writer(String name, int age) {
  5. this.name = name;
  6. this.age = age;
  7. }
  8. public int getAge() {
  9. return age;
  10. }
  11. public String getName() {
  12. return name;
  13. }
  14. }

那么,对于 Records 来说,一条 Record 就代表一个不变的状态。尽管它会提供诸如 equals()hashCode()toString()、构造方法,以及字段的 getter,但它无意替代可变对象的类(没有 setter),以及 Lombok 提供的功能。

来用 Records 替代一下上面这个 Writer 类:

  1. public record Writer(String name, int age) { }

你看,一行代码就搞定。关键是比之前的代码功能更丰富,来看一下反编译后的字节码:

  1. public final class Writer extends java.lang.Record {
  2. private final java.lang.String name;
  3. private final int age;
  4. public Writer(java.lang.String name, int age) { /* compiled code */ }
  5. public java.lang.String toString() { /* compiled code */ }
  6. public final int hashCode() { /* compiled code */ }
  7. public final boolean equals(java.lang.Object o) { /* compiled code */ }
  8. public java.lang.String name() { /* compiled code */ }
  9. public int age() { /* compiled code */ }
  10. }

类是 final 的,字段是 private final 的,构造方法有两个参数,toString()hashCode()equals() 方法也有了,getter 方法也有了,只不过没有 get 前缀。但是没有 setter 方法,也就是说 Records 确实针对的是不可变对象——鉴定完毕。那怎么使用 Records 呢?

  1. public class WriterDemo {
  2. public static void main(String[] args) {
  3. Writer writer = new Writer("沉默王二",18);
  4. System.out.println("toString:" + writer);
  5. System.out.println("hashCode:" + writer.hashCode());
  6. System.out.println("name:" + writer.name());
  7. System.out.println("age:" + writer.age());
  8. Writer writer1 = new Writer("沉默王二", 18);
  9. System.out.println("equals:" + (writer.equals(writer1)));
  10. }
  11. }

程序输出的结果如下所示:

  1. toStringWriter[name=沉默王二, age=18]
  2. hashCode1130697218
  3. name:沉默王二
  4. age18
  5. equalstrue

不错不错,真香,以后定义不可变类时就简单了,强烈希望这个特性在下个版本中转正。

03、switch 表达式

关于 switch 表达式,我在之前的一篇文章中已经详细说明了,点击传送门可以跳转过去看看。两周时间过去了,switch 表达式终于“媳妇熬成婆”,转正了,恭喜恭喜。

记得这篇文章发表到掘金的时候,被喷子各种无脑 diss,说:“还以为你有什么技巧,没想到用的是 Java 13,可我们还停留在 Java 8 啊!”这显然是一种固步自封的心态,非常不可取,程序员不应该这样。一个最简单的道理就是,Java 6 当年也很经典,不是被 Java 8 取代了吗?随着时间的推移,Java 8 早晚会被更划时代的新版本取代——总要进步嘛。

关于 switch 表达式,这里就简单地搬个例子给你瞧瞧:

  1. public class SwitchDemo {
  2. enum PlayerTypes {
  3. TENNIS,
  4. FOOTBALL,
  5. BASKETBALL,
  6. PINGPANG,
  7. UNKNOWN
  8. }
  9. public static void main(String[] args) {
  10. System.out.println(createPlayer(PlayerTypes.BASKETBALL));
  11. }
  12. private static String createPlayer(PlayerTypes playerType) {
  13. return switch (playerType) {
  14. case TENNIS -> "网球运动员费德勒";
  15. case FOOTBALL -> "足球运动员C罗";
  16. case BASKETBALL -> "篮球运动员詹姆斯";
  17. case PINGPANG -> "乒乓球运动员马龙";
  18. case UNKNOWN -> throw new IllegalArgumentException("未知");
  19. };
  20. }
  21. }

除了可以使用 -> 的新式语法,还可以作为 return 结果,真香。

04、Text Blocks

在文本块(Text Blocks)出现之前,如果我们需要拼接多行的字符串,就需要很多英文双引号和加号,看起来就好像老太婆的裹脚布,非常不雅。如果恰好要拼接一些 HTML 格式的文本(原生 SQL 也是如此)的话,还要通过空格进行排版,通过换行转义符 \n 进行换行,这些繁琐的工作对于一名开发人员来说,简直就是灾难。

  1. public class OldTextBlock {
  2. public static void main(String[] args) {
  3. String html = "<html>\n" +
  4. " <body>\n" +
  5. " <p>Hello, world</p>\n" +
  6. " </body>\n" +
  7. "</html>\n";
  8. System.out.println(html);
  9. }
  10. }

Java 14 就完全不同了:

  1. public class NewTextBlock {
  2. public static void main(String[] args) {
  3. String html = """
  4. <html>
  5. <body>
  6. <p>Hello, world</p>
  7. </body>
  8. </html>
  9. """;
  10. System.out.println(html);
  11. }
  12. }

多余的英文双引号、加号、换行转义符,统统不见了。仅仅是通过前后三个英文双引号就实现了。我只能说,香,它真的香!

1179389-57685bd3d7f74d07.gif

05、鸣谢

好了,我亲爱的读者朋友,以上就是本文的全部内容了,能看到这里的就是最优秀的程序员。原创不易,莫要白票,请你为本文点赞个吧,这将是我写作更多优质文章的最强动力。

如果觉得文章对你有点帮助,请微信搜索「 沉默王二 」第一时间阅读,回复【666】【1024】更有我为你精心准备的 500G 高清教学视频(已分门别类),以及大厂技术牛人整理的面经一份,本文源码已收录在码云,传送门~

发表评论

表情:
评论列表 (有 0 条评论,468人围观)

还没有评论,来说两句吧...

相关阅读

    相关 网络安全“

    转自:[网络安全“真香”][Link 1]  2019年9月16日至22日 是国家网络安全宣传周   今年的主题是 “网络安全为人民,网络安全靠人民” 没有网络安

    相关 百家讲坛,

    虽然多年前,就已经经常耳闻目睹了,但最近几个月,才开始从蜻蜓APP中听百家讲坛和一些教授讲历史方面的东西。 发现,原来以前的自己不喜欢听,是错过了多少高价值的东西啊。 看来

    相关 Blink

    ![1362737771-5c7867fec6839_articlex][] Blink 开源了有一段时间了,竟然没发现有人写相关的博客,其实我已经在我的知识星球里开始写了,