Java14新特性

【李兴华编程训练营】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 {
   
public static void main(String[] args) { // 沐言科技:www.yootk.com
       
int select = 1 ; // 整型变量
        switch (select) {
           
case 1 -> System.out.println("沐言科技:www.yootk.com") ;
           
case 2 -> System.out.println("VIP训练营:edu.yootk.com") ;
           
default -> System.out.println("Java从入门到项目实战》、《Python从入门到项目实战》") ;
        }
    }
}

程序执行结果:

沐言科技:www.yootk.com

       在以前传统的switch语法结构里面,如果要采用的是原始的case结构,则一定要编写break,但是在JDK14之中只需要做一个简单的语法更换,就可以非常轻松的实现case的直接判断,并且不会触发其他的case执行。

NullPointerException准确定位

       如果要是想搞Java一定永远和空指向(NullPointerException)不可分割,只要是编写程序该问题始终都会陪伴着我们,但是传统的开发过程里面只要是出现了空指向异常都会有一个问题:无法确认到底那个地方有空指向,尤其是在编写代码链的过程之中,下面来观察一下原始的错误。

范例:观察原始代码的错误

class Company {}

  class Dept {

    private Company company ;

    public Company getCompany() {

        return company;

    }

    public void setCompany(Company company) {

        this.company = company;

    }

}

  class Emp {

    private Dept dept ;

    public Dept getDept() {

        return dept;

    }

    public void setDept(Dept dept) {

        this.dept = dept;

    }

}

  public class YootkDemo {

    public static void main(String[] args) { // 沐言科技:www.yootk.com

        Emp emp = new Emp() ;

        System.out.println(emp.getDept().getCompany());

    }

}

程序执行结果:

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定义程序类

// 此时Book类中就存在有了title、author、price三个属性,同时这三个属性都会使用private进行封装

  record Book(String title, String author, double price) {}

  public class YootkDemo {

    public static void main(String[] args) { // 沐言科技:www.yootk.com

        Book book = new Book("Java从入门到项目实战", "李兴华", 99.8) ;

        System.out.println(book) ;

    }

}

程序编译命令:

javac --enable-preview -source 14 YootkDemo.java

程序执行命令:

java --enable-preview YootkDemo

程序执行结果:

Book[title=Java从入门到项目实战, author=李兴华, price=99.8]

       通过此时的执行结果可以发现,简单java类的定义形式已经非常的容易了,只需要编写一点点相关的参数就可以实现繁琐的简单Java类的定义,同时类的内部也会自动的提供toString()输出方法。

       在这种Record类型里面实际上也可以定义构造方法,构造方法可以不用于设置内容,可以实现一些参数的检测。

范例:在record类中定义构造方法

// 此时Book类中就存在有了title、author、price三个属性,同时这三个属性都会使用private进行封装

  record Book(String title, String author, double price) {

        public Book {

                if (price < 0.0) {

                        throw new RuntimeException("你见过图书的定义小于0吗?") ;

                }

        }

}

  public class YootkDemo {

    public static void main(String[] args) { // 沐言科技:www.yootk.com

        Book book = new Book("Java从入门到项目实战", "李兴华", -99.8) ;

        System.out.println(book) ;

    }

}

程序编译命令:

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也属于预览功能,这些功能慢慢都会转正,所以未来的某一天一旦转正了,那么就有可能带来新的开发结构。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yootk

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值