【李兴华编程训练营】Java14新特性
在2020年的03月28日(美东时间2020年的03月27日)Oracle公司正式公布了Java14的开发版本,伴随而来的就有了许多的新特性,同时也有许多的技术也开始逐步被淘汰,任何的环境都无法阻止技术革新所带来的优胜劣汰。
如果要想知道Java14里面到底引入了那些新特性,同时在Java14版本之中那些的技术有可能被淘汰了,则可以根据Oracle官方给出的说明文档进行总结,文档地址:https://www.oracle.com/technetwork/java/javase/14all-relnotes-5809668.html
1、 新的支持:
· Recorders(简单Java类的一种简化处理),在整个的Java开发环境里面简单Java类几乎是无处不在;
· ZGC终极回收的GC算法(现阶段最牛X的GC算法)已经可以支持Windows、MacOS;
· switch之中的处理支持(不是预览版);
2、 移除的支持:
· 移除CMS(Concurrent Mark and Sweep (CMS) Garbage Collector)回收算法;
switch新支持
从JDK 1.5开始Java就开始针对于switch语法结构提供了更多的处理支持:
· 【JDK 1.5】switch语法支持了Enum(枚举)判断(在JDK 1.5的时候正式引入了enum关键字);
· 【JDK 1.7】Oracle收购了SUN之后公布的第一个版本的JDK,在这个JDK里面switch支持了String的判断;
· 【JDK 13】switch之中提供有了一个yield局部返回新的关键字;
· 【JDK 14】switch里面为了解决break的问题,所以又提供了新的语法支持;
在传统的switch处理开发过程之中,每一个case判断之后都需要为其追加有一个break,如果不追加这个break则会在第一个满足case的位置之后所有的case都会执行,一直到遇见了break为止。
提示:很多的新特性都未必可以直接在开发工具上使用,因为开发工具里面都会有语法的动态的解析处理,如果是新的语法同时这个开发工具又不支持,那么这个时候就会出现语法错误的问题,但是实际上这个语法并没有错误。 |
范例:switch新支持
public class YootkDemo { | |
程序执行结果: | 沐言科技:www.yootk.com |
在以前传统的switch语法结构里面,如果要采用的是原始的case结构,则一定要编写break,但是在JDK14之中只需要做一个简单的语法更换,就可以非常轻松的实现case的直接判断,并且不会触发其他的case执行。
NullPointerException准确定位
如果要是想搞Java一定永远和空指向(NullPointerException)不可分割,只要是编写程序该问题始终都会陪伴着我们,但是传统的开发过程里面只要是出现了空指向异常都会有一个问题:无法确认到底那个地方有空指向,尤其是在编写代码链的过程之中,下面来观察一下原始的错误。
范例:观察原始代码的错误
| |
程序执行结果: | Exception in thread "main" java.lang.NullPointerException at YootkDemo.main(YootkDemo.java:23) |
此时的代码使用了一个代码链的形式出现了,但是在整个的处理过程之中并没有为Emp类中的dept属性进行初始化赋值操作,所以这个时候一旦执行了代码那么就会出错,这个时候可以考虑在代码执行的时候追加一些参数:
-XX:+ShowCodeDetailsInExceptionMessages | |
程序执行命令: | java -XX:+ShowCodeDetailsInExceptionMessages YootkDemo |
程序执行结果: | Exception in thread "main" java.lang.NullPointerException: Cannot invoke "Dept.getCompany()" because the return value of "Emp.getDept()" is null at YootkDemo.main(YootkDemo.java:23) |
通过此时的代码执行结果可以清楚的发现,明确的告诉了用户“Emp.getDept()“代码中出现了问题,所以对于在代码链使用过程之中所出现的空指向异常就可以轻松进行定位了。
Record类型
在Java程序开发过程之中简单Java类一直属于项目使用频次比较高的程序功能,但是简单Java类虽然产生了很多年,但是依然会有很多的开发者觉得其太啰嗦,因为属性名称和setter需要对应,所以在JDK14的时候提供了一个record类型,简化了简单Java类的定义。
范例:使用record定义程序类
| |
程序编译命令: | javac --enable-preview -source 14 YootkDemo.java |
程序执行命令: | java --enable-preview YootkDemo |
程序执行结果: | Book[title=Java从入门到项目实战, author=李兴华, price=99.8] |
通过此时的执行结果可以发现,简单java类的定义形式已经非常的容易了,只需要编写一点点相关的参数就可以实现繁琐的简单Java类的定义,同时类的内部也会自动的提供toString()输出方法。
在这种Record类型里面实际上也可以定义构造方法,构造方法可以不用于设置内容,可以实现一些参数的检测。
范例:在record类中定义构造方法
| |
程序编译命令: | javac --enable-preview -source 14 YootkDemo.java |
程序执行命令: | java --enable-preview YootkDemo |
程序执行结果: | Exception in thread "main" java.lang.RuntimeException: 你见过图书的定义小于0吗? at Book.<init>(YootkDemo.java:5) at YootkDemo.main(YootkDemo.java:11) |
在JDK 13里面yield局部返回属于预览功能,而在JDK 13里面的ZGC也属于预览功能,这些功能慢慢都会转正,所以未来的某一天一旦转正了,那么就有可能带来新的开发结构。