据甲骨文称,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) { }
public java.lang.String toString() { }
public final int hashCode() { }
public final boolean equals(java.lang.Object o) { }
public java.lang.String name() { }
public int age() { }
}
因此,我们得到了一个最终类,而不是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");
}
- 返回值的能力:
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不断发展,使普通的普通开发人员的生活变得更加轻松。新功能旨在使代码更整洁,工作更轻松,薪水更高。您如何看待,哪些新功能会赢得社区的喜爱?