Java 14即将到来



据甲骨文称,Java 14计划于3月17日发布。我想知道发布日期是否与圣帕特里克节(这一天庆祝)有关,我们是否很快就会发现。让我们看一下新Java中将提供的创新,并决定我们喝啤酒是为了欢喜还是悲伤。

记录


一种基本的新语言功能,可在Java 14中以预览模式使用。主要目标是消除代码中的许多细面条。记录应替换仅用于在字段中存储数据而没有任何描述行为的类。定义Record,编译器本身将生成构造函数,getters,equals()和hashCode(),toString()方法。我们已经在某个地方看到了,对吧,龙目先生?条目如下:

public record Person(String name, int age){}

为了编译Record,必须下载jdk14并输入以下命令:

javac —enable-preview —release 14 Person.java

我们反编译,看看编译器做了什么:

public final class Person extends java.lang.Record {
    private final java.lang.String name;
    private final int age;

    public Person(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 */ }
}

因此,我们得到了一个最终类,而不是Record,它从新的抽象Record类继承正如预期的那样,我们得到了生成的吸气剂,构造函数,equals(),hashCode(),toString()请注意,所有字段都标记为final,这意味着我们无法重新定义它们,但是Record本身并不是完全不变的,因为 存储在字段中的对象可以是可变的。有关Record的详细讨论可以在这里找到

健谈的NullPointerExceptions


更友好的将是NullPointerExceptions不,编译器仍然不知道如何为我们修复NPE,但是现在对异常的描述将变得更加有用。我们模拟这种情况:我们在Java 11和Java 14中调用NPE。例如,我们有一个复杂的结构(通常是Entity),并且要获取数据,我们需要从源调用多个对象以到达所需字段,等等:

var street = message.getAuthor().getAddress().getStreet();

在Java 11中,我们得到了一个熟悉的旧错误日志,该日志留下了主要问题:谁为空?留言,作者,地址?

Exception in thread "main" java.lang.NullPointerException
	at Main.main(Main.java:11)

要在Java 14上运行,您需要以与上述Record相同的方式编译该类

javac —enable-preview —release 14 Main.java

并通过添加一个特殊标志执行:

java -XX:+ShowCodeDetailsInExceptionMessages --enable-preview Main

作为执行的结果,我们得到以下输出:

Exception in thread "main" java.lang.NullPointerException: Cannot invoke "Address.getStreet()" because the return value of "Author.getAddress()" is null
	at Main.main(Main.java:11)

如我们所见,该消息变得更具信息性,并且我们可以看到呼叫链NPE中确切发生的位置

文字区块


Java 13中引入的文本块也可以在Java 14中用作预览功能。让我提醒您,他们的主要任务是简化多行文字的工作。编写SQL查询,HTML代码,JSON的非常方便的功能我认为这是将变得非常有用的功能之一。回顾语法。例如,我们需要编写一个SQL查询在Java 13之前,我们将使用字符串连接来编写可读的查询,该查询将类似于以下内容:

String sql = "SELECT name, age " +
                 "FROM PERSON" +
                 "WHERE name = \'Igor\'" +
                 "AND car=\'Niva\'";

从Java 13开始,我们可以通过在三重双引号之间写一行来使用文本块,如下所示:


    String sql = """ 
                 SELECT name, age 
                 FROM PERSON
                 WHERE name = 'Igor'
                   AND car='Niva'
                 """;

Java 14添加了两个可以在文本块中使用的新定界符。第一个是单个空格:\ s第二个是换行符:\

切换表达式


从Java 14开始,开关表达式从预览功能变为完整功能。让我们简要回顾一下新运算符的功能:

  • Lambda语法
  • 能够在一个案例中使用多个表达式
  • 如果未完全覆盖可能的switch()值集合,则会输出错误换句话说,如果您使用枚举:

    public enum  Car {
        NIVA, NEXIA, KIA
    }

    因此,如果您按如下方式编写switch(),则编译器将引发错误,提示未列出列举中所有可能的情况:

    switch (car) {
        case NIVA -> System.out.println("Niva");
        case NEXIA -> System.out.println("Nexia");
    }
    // error: the switch expressions does not cover all possible input values.

  • 返回值的能力:

    var avto = switch (car) {
        case NIVA, KIA -> "Niva are better";
        case NEXIA -> "Nexia";
        default -> "Niva still better";
    };


模式匹配


模式匹配是 Java 14中可用新预览功能。已经有很多关于它的讨论,很多人正在等待它,这里就是。目标是将对象类型检查及其转换结合到instanceof运算符中换句话说,在Java 14之前,我们应该这样写:

Object obj = "Igor";

if (obj instanceof String) {
    String s = (String) obj;
    System.out.println(s.length());
}

那些。为了使用该对象所在类的方法,您需要将其强制转换为此类。从Java 14开始,可以使用新的语法,其中instanceof结合了验证和转换功能:

Object obj = "Igor";

if (obj instanceof String s){
    System.out.println(s.length());
}

结论


Java不断发展,使普通的普通开发人员的生活变得更加轻松。新功能旨在使代码更整洁,工作更轻松,薪水更高。您如何看待,哪些新功能会赢得社区的喜爱?

All Articles