Java14新特性及代码示例

  |   0 评论   |   0 浏览

Java 14 于 2020 年 3 月 17 日发布。在这篇文章中,我们将介绍 Java编程语言中添加的一些特性以及一些代码示例。

Java14的主要更新内容如下:

  • instanceof 的模式匹配(预览版)
  • 文本块 (第二次预览)
  • NullPointerExceptions:精确描述哪个变量是null
  • record记录类(预览)
  • switch表达式(标准)

1. instanceof 的模式匹配(预览版)

在 Java 14 中,instanceof运算符已被修改为具有类型的表达式。类型测试模式(在instanceof中使用)由指定类型的描述和单个变量组成。

在下面的代码中,短语String s是类型测试模式:

if (obj instanceof String s) {
    // 这里可以使用s
} else {
    // 这里不能使用变量s
}

2. 文本块 (第二次预览)

Java处理json或者xml文本时,需要多个繁琐的嵌套转义,代码写着费劲,维护更费劲。从Java13开始引入了文本块(Text blocks),上代码:

package cn.dayangshuo;

/**
 * @author DAYANG
 */
public class TextBlocks {
    public static void main(String[] args) {
        //需要转义
        String jsonStr = "{\"name\": \"大阳\"}";
        //文本块,不需要转义字符
        String textBlocks = """
                {"name": "大阳"}
                """;
        System.out.println(jsonStr);
        System.out.println(textBlocks);
    }
}

3. NullPointerExceptions:精确描述哪个变量是null

package cn.dayangshuo.collectors;

/**
 * @author DAYANG
 */
public class NullPointerExceprionsTest {
    //空指针报错
    public static void main(String[] args) {
        User user = null;
        System.out.println(user.getName());
    }

    static class User{
        private String name;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
    }
}

//jdk8的报错信息:
Exception in thread "main" java.lang.NullPointerException
    at cn.dayangshuo.collectors.NullPointerExceprionsTest.main(NullPointerExceprionsTest.java:9)

//jdk14的报错信息:  
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "cn.dayangshuo.collectors.NullPointerExceprionsTest$User.getName()" because "user" is null
    at cn.dayangshuo.collectors.NullPointerExceprionsTest.main(NullPointerExceprionsTest.java:9)

4. record记录类(预览)

传统的Java应用程序通过创建一个类,通过该类的构造方法实例化类,并通过getter和setter方法访问成员变量或者设置成员变量的值。有了record关键字,你的代码会变得更加简洁。

package cn.dayangshuo;

/**
 * 普通的dto
 * @author DAYANG
 */
public class NormalEntity {
    public static void main(String[] args) {
        //传统的方式
        User1 user1 = new User1("大阳", 1990);
        System.out.println(user1);
        //reocrd 记录类
        User2 user2 = new User2("大阳", 1990);
        System.out.println(user2);
    }
}

/**
 * 成员变量都是固定的
 */
class User1 {
    String name;
    Integer age;
    public User1(String name, Integer age) {
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "User1[" +
                "name='" + name + '\'' +
                ", age=" + age +
                ']';
    }
}

package cn.dayangshuo;
/**
 * record 记录类
 * 你也可以覆写equals() hashCode() toString()方法
 * @author DAYANG
 */
record User2(String name, Integer age) {
    @Override
    public String toString() {
        return "User2[" +
                "name='" + name + '\'' +
                ", age=" + age +
                ']';
    }
    @Override
    public boolean equals(Object obj) {
        return false;
    }
    @Override
    public int hashCode() {
        return 0;
    }
}

5. switch表达式(标准)

上代码:

package cn.dayangshuo;

/**
 * @author DAYANG
 */
public class OldSwitch {
    public static void main(String[] args) {
        oldSwitch();
        newSwitch();
    }

    private static void oldSwitch() {
        int size = 3;
        String cn = "";
        switch (size) {
            case 1:
                cn = "壹";
                break;
            case 2:
                cn = "贰";
                break;
            case 3:
                cn = "叁";
                break;
            default:
                cn = "未知";
        }
        System.out.println(cn);
    }
    //更清爽
    private static void newSwitch() {
        int size = 3;
        String cn = switch (size) {
            case 1 -> "壹";
            case 2 -> "贰";
            case 3, 4 -> "叁";
            default -> "未知";
        };
        System.out.println(cn);
    }
}

转自https://zhuanlan.zhihu.com/p/483755479


标题:Java14新特性及代码示例
作者:michael
地址:https://blog.junxworks.cn/articles/2022/12/02/1669972341099.html