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

红色线划出来的是我比较感兴趣的,其余的对我没什么太大的吸引力,就暂且略过。
01、下载 JDK 14
要想开箱,得先下载 JDK 14,不然拿什么开箱呢,对吧?有 2 处地方可供下载,Oracle 上可以下载商用版, jdk.java.net 上可以下载开源版。我们就选择后者吧。

我目前用的是 Windows 操作系统,所以就选择 Windows 版的 zip 包进行下载,完成后记得解压。
02、升级 IntelliJ IDEA
需要把 IDEA 升级到抢先体验版 2020.1 EAP,否则无法支持 Java 14 的新特性。

社区版的下载地址如下所示:
[https://www.jetbrains.com/idea/nextversion/#section=windows](https://www.jetbrains.com/idea/nextversion/#section=windows)
安装的时候可以把之前的版本卸载,也可以选择保留。完成后,我们来新建一个 Java 14 的项目。

01、instanceof
按照新特性的顺序,我们就先从 instanceof 说起吧。旧式的 instanceof 的用法如下所示:
public class OldInstanceOf {
    public static void main(String[] args) {
        Object str = "Java 14,真香";
        if (str instanceof String) {
            String s = (String)str;
            System.out.println(s.length());
        }
    }
}
需要先使用 instanceof 在 if 条件中判断 str 的类型是否为 String(第一步),再在 if 语句中将 str 强转为字符串类型(第二步),并且要重新声明一个变量用于强转后的赋值(第三步)。
三个步骤也不算多,但总觉得应该还有更好的语法,这不,Java 14 就想到了这一层。
public class NewInstanceOf {
    public static void main(String[] args) {
        Object str = "Java 14,真香";
        if (str instanceof String s) {
            System.out.println(s.length());
        }
    }
}
可以直接在 if 条件判断类型的时候添加一个变量,就不需要再强转和声明新的变量了。是不是特别简洁?但模式匹配的 instanceof 在 Java 14 中是预览版的,默认是不启用的,所以这段代码会有一个奇怪的编译错误(Java 14 中不支持模式匹配的 instanceof)。

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

设置完成后,编译错误就随风飘走了。程序输出的结果如下所示:
10
不错不错,真香。想知道 Java 编译器在背后帮我们做了什么吗?看一下反编译后的字节码就明白了。
public class NewInstanceOf {
    public NewInstanceOf() {
    }
    public static void main(String[] args) {
        Object str = "Java 14,真香";
        String s;
        if (str instanceof String && (s = (String)str) == (String)str) {
            System.out.println(s.length());
        }
    }
}
在 if 条件判断前,先声明了变量 s,然后在 if  条件中进行了强转 s = (String)str),并且判断了 s 和 str 是否相等。确实是一个解放开放者生产力的好特性,强烈希望这个特性在下个版本中转正。
02、Records
在之前的一篇文章中,我谈到了类的不可变性,它是这样定义的:
public final class Writer {
    private final String name;
    private final int age;
    public Writer(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public int getAge() {
        return age;
    }
    public String getName() {
        return name;
    }
}
那么,对于 Records 来说,一条 Record 就代表一个不变的状态。尽管它会提供诸如 equals()、hashCode()、toString()、构造方法,以及字段的 getter,但它无意替代可变对象的类(没有 setter),以及 Lombok 提供的功能。
来用 Records 替代一下上面这个 Writer 类:
public record Writer(String name, int age) { }
你看,一行代码就搞定。关键是比之前的代码功能更丰富,来看一下反编译后的字节码:
public final class Writer extends java.lang.Record {
    private final java.lang.String name;
    private final int age;
    public Writer(java.lang.String name, int age) { /* compiled code */ }
    public java.lang.String toString() { /* compiled code */ }
    public final int hashCode() { /* compiled code */ }
    public final boolean equals(java.lang.Object o) { /* compiled code */ }
    public java.lang.String name() { /* compiled code */ }
    public int age() { /* compiled code */ }
}
类是 final 的,字段是 private final 的,构造方法有两个参数,toString()、hashCode()、equals() 方法也有了,getter 方法也有了,只不过没有 get 前缀。但是没有 setter 方法,也就是说 Records 确实针对的是不可变对象——鉴定完毕。那怎么使用 Records 呢?
public class WriterDemo {
    public static void main(String[] args) {
        Writer writer = new Writer("沉默王二",18);
        System.out.println("toString:" + writer);
        System.out.println("hashCode:" + writer.hashCode());
        System.out.println("name:" + writer.name());
        System.out.println("age:" + writer.age());
        Writer writer1 = new Writer("沉默王二", 18);
        System.out.println("equals:" + (writer.equals(writer1)));
    }
}
程序输出的结果如下所示:
toString:Writer[name=沉默王二, age=18]
hashCode:1130697218
name:沉默王二
age:18
equals:true
不错不错,真香,以后定义不可变类时就简单了,强烈希望这个特性在下个版本中转正。
03、switch 表达式
关于 switch 表达式,我在之前的一篇文章中已经详细说明了,点击传送门可以跳转过去看看。两周时间过去了,switch 表达式终于“媳妇熬成婆”,转正了,恭喜恭喜。
记得这篇文章发表到掘金的时候,被喷子各种无脑 diss,说:“还以为你有什么技巧,没想到用的是 Java 13,可我们还停留在 Java 8 啊!”这显然是一种固步自封的心态,非常不可取,程序员不应该这样。一个最简单的道理就是,Java 6 当年也很经典,不是被 Java 8 取代了吗?随着时间的推移,Java 8 早晚会被更划时代的新版本取代——总要进步嘛。
关于 switch 表达式,这里就简单地搬个例子给你瞧瞧:
public class SwitchDemo {
    enum PlayerTypes {
        TENNIS,
        FOOTBALL,
        BASKETBALL,
        PINGPANG,
        UNKNOWN
    }
    public static void main(String[] args) {
        System.out.println(createPlayer(PlayerTypes.BASKETBALL));
    }
    private static String createPlayer(PlayerTypes playerType) {
        return switch (playerType) {
            case TENNIS -> "网球运动员费德勒";
            case FOOTBALL -> "足球运动员C罗";
            case BASKETBALL -> "篮球运动员詹姆斯";
            case PINGPANG -> "乒乓球运动员马龙";
            case UNKNOWN -> throw new IllegalArgumentException("未知");
        };
    }
}
除了可以使用 -> 的新式语法,还可以作为 return 结果,真香。
04、Text Blocks
在文本块(Text Blocks)出现之前,如果我们需要拼接多行的字符串,就需要很多英文双引号和加号,看起来就好像老太婆的裹脚布,非常不雅。如果恰好要拼接一些 HTML 格式的文本(原生 SQL 也是如此)的话,还要通过空格进行排版,通过换行转义符 \n 进行换行,这些繁琐的工作对于一名开发人员来说,简直就是灾难。
public class OldTextBlock {
    public static void main(String[] args) {
        String html = "<html>\n" +
                "    <body>\n" +
                "        <p>Hello, world</p>\n" +
                "    </body>\n" +
                "</html>\n";
        System.out.println(html);
    }
}
Java 14 就完全不同了:
public class NewTextBlock {
    public static void main(String[] args) {
        String html = """
              <html>
                  <body>
                      <p>Hello, world</p>
                  </body>
              </html>
              """;
        System.out.println(html);
    }
}
多余的英文双引号、加号、换行转义符,统统不见了。仅仅是通过前后三个英文双引号就实现了。我只能说,香,它真的香!

05、鸣谢
好了,我亲爱的读者朋友,以上就是本文的全部内容了,能看到这里的就是最优秀的程序员。原创不易,莫要白票,请你为本文点赞个吧,这将是我写作更多优质文章的最强动力。
如果觉得文章对你有点帮助,请微信搜索「 沉默王二 」第一时间阅读,回复【666】【1024】更有我为你精心准备的 500G 高清教学视频(已分门别类),以及大厂技术牛人整理的面经一份,本文源码已收录在码云,传送门~
Java 14 开箱,它真香香香香的更多相关文章
- JAVA之旅(三十五)——完结篇,终于把JAVA写完了,真感概呐!
		JAVA之旅(三十五)--完结篇,终于把JAVA写完了,真感概呐! 这篇博文只是用来水经验的,写这个系列是因为我自己的java本身也不是特别好,所以重温了一下,但是手比较痒于是就写出了这三十多篇博客了 ... 
- Java 14 可能带来什么新特性?
		JDK/Java 13 在一个月前已经发布,该版本带来了 5 大新特性,笔者观察到其中的 Text Blocks(文本块)特性似乎被讨论最多. 文本块特性与常见的 Python "" ... 
- Java 14 都要来了,为什么还有这么多人固守Java8?
		作者:刘欣 从Java 9开始,Java版本的发布就让人眼花缭乱了. 每隔6个月,都会冒出一个新版本出来,Java 10 , Java 11, Java 12, Java 13, 到2020年3月份, ... 
- Java 14 令人期待的 5 大新特性,打包工具终于要来了
		随着新的 Java 发布生命周期的到来,新版本预计将于 2020 年 3 月发布,本文将对其中的 5 个主要特性作些概述. Java 13刚刚发布给开发人员使用不久,最新版本的JDK于2019年9月发 ... 
- Java 14 有哪些新特性?
		记录为 Java 提供了一种正确实现数据类的能力,不再需要为实现数据类而编写冗长的代码.下面就来看看 Java 14 中的记录有哪些新特性. 作者 | Nathan Esquenazi 译者 | 弯月 ... 
- Java 14 发布了,可以扔掉Lombok了?
		2020年3月17日发布,Java正式发布了JDK 14 ,目前已经可以开放下载.在JDK 14中,共有16个新特性,本文主要来介绍其中的一个特性:JEP 359: Records 官方吐槽最为致命 ... 
- Java 8 到 Java 14,改变了哪些你写代码的方式?
		前几天,JDK 14 正式发布了,这次发布的新版本一共包含了16个新的特性. 其实,从Java8 到 Java14 ,真正的改变了程序员写代码的方式的特性并不多,我们这篇文章就来看一下都有哪些. La ... 
- Java 14 来势汹汹,这回让空指针无处遁形!!
		上篇:Java 14 之模式匹配,非常赞的一个新特性! 相信在坐的每一位 Java 程序员都遇到过空指针异常: NullPointerException(NPE),不甚其烦. 栈长之前也分享几篇避免空 ... 
- JDK/Java 14 发布
		3 月 17 日,JDK/Java 14 正式 GA. 此版本包含的 JEP(Java/JDK Enhancement Proposals,JDK 增强提案)比 Java 12 和 13 加起来的还要 ... 
随机推荐
- SWUST OJ 有趣的三位数(0319)
			有趣的三位数(0319) Time limit(ms): 1000 Memory limit(kb): 65535 Submission: 158 Accepted: 62 Description ... 
- Python获取内网IP
			Python 获取本机内网IP 本文记录使用Python获取本机IP的两种方法. 通过hostname来获取本机IP import socket print(socket.gethostbyname( ... 
- 机器CPU load过高问题排查
			load average的概念 系统平均负载定义:在特定时间间隔内运行队列中(在CPU上运行或者等待运行多少进程)的平均进程数.如果一个进程满足以下条件则其就会位于运行队列中: 它没有在等待I/O操作 ... 
- org.springframework.jdbc.UncategorizedSQLException:  ### Error updating database.  Cause: java.sql.SQLException: Incorrect string value: '\xE2\x80\x8B\xE2\x80\x8B...' for column 'pro_backgroud' at row
			如果你在mysql数据库中,将所有的表的编码格式设置成为utf-8之后还是不行,那就试试这个吧:ALTER TABLE your_database_name.your_table CONVERT TO ... 
- Web中间件常见漏洞总结
			一.IIS中间组件: 1.PUT漏洞 2.短文件名猜解 3.远程代码执行 4.解析漏洞 二.Apache中间组件: 1.解析漏洞 2.目录遍历 三.Nginx中间组件: 1.文件解析 2.目录遍历 3 ... 
- 用 Java 实现人脸识别功能(附源码)
			整理了一些Java方面的架构.面试资料(微服务.集群.分布式.中间件等),有需要的小伙伴可以关注公众号[程序员内点事],无套路自行领取 更多优选 一口气说出 9种 分布式ID生成方式,面试官有点懵了 ... 
- css 进度条的文字根据进度渐变
			需求 1.进度条里面的文字需要根据进度的长度而变化 原理 用两个一模一样的样式的 div 重叠起来 效果 字体开始为 蓝色,跟随进度条变为 白色 在线预览: https://jsfiddle.net/ ... 
- 前端面试题-<!DOCTYPE>
			现在的各种前端开发工具都足够强大,支持插入模板代码,也就导致我们往往会忽略已经自动生成的代码,而代码的第一行 DOCTYPE 声明,就是最容易忽略的部分. 一.DOCTYPE DOCTYPE 是 do ... 
- 沃土前端系列 - HTML常用标签
			html是什么 HTML是Hyper Text Markup Language的缩写,中文的意思是"超文本标记语言",它是制作网页的标准语言.由于网页中不仅包含普通文本,还包含超文 ... 
- Yuchuan_linux_C 编程之八 文件操作相关函数
			一.整体大纲 st_mode整体介绍: st_mode详细介绍: 二. Linux文件操作相关函数 1. stat 作用:获得文件信息,也可以获取文件大小. 头文件 #include <sys/ ... 
