Java 14,有哪几个值得关注的新特性?转载
概述
Java 14 于 2020 年 3 月 17 日发布。此版本引入了一些新功能作为预览,以便为未来版本标准化这些功能。本文列出了 Java 14 中的示例代码的重要特性。
#1 切换表达式(标准)
这是此版本中唯一的标准化功能,它是 Java 13 和 Java 12 中的预览功能。
在 Java 14 之前,当使用 switch 语句时,我们仅将其用作检查变量值的语句。根据这个变量的值,我们可以根据需要定义一组不同的语句来执行。
public class SwitchStatement {
public static void main(String[] args) {
Integer messageNumber = 2;
switch (messageNumber) {
case 1:
System.out.println("Tech");
break;
case 2:
System.out.println("Is");
break;
case 3:
System.out.println("Beautiful");
break;
default:
System.out.println("No message");
break;
}
}
}
代码输出:
有了上面的写法,我们会遇到以下3个常见问题:
1.我们可以忘记声明一个break语句,这使得代码继续运行到下一个case,而不是匹配上一个case并停止。
public class SwitchStatement1Before14 {
public static void main(String[] args) {
Integer messageNumber = 2;
switch (messageNumber) {
case 1:
System.out.println("Tech");
break;
case 2:
System.out.println("Is");
case 3:
System.out.println("Beautiful");
break;
default:
System.out.println("No message");
break;
}
}
}
代码输出:
2.如果要检查的变量值不同,但内部处理相同,会导致代码重复
public class SwitchStatement2Before14 {
public static void main(String[] args) {
Integer messageNumber = 2;
switch (messageNumber) {
case 1:
System.out.println("Tech");
break;
case 2:
System.out.println("Is");
break;
case 3:
System.out.println("Beautiful");
break;
case 4:
System.out.println("Beautiful");
break;
default:
System.out.println("No message");
break;
}
}
}
3.使用switch语句定义值必须冗长,使代码混乱。您必须编写以下内容:
public class SwitchStatement3Before14 {
public static void main(String[] args) {
Integer messageNumber = 2;
String messageContent = "";
switch (messageNumber) {
case 1:
messageContent = "Tech";
break;
case 2:
messageContent = "Is";
break;
case 3:
messageContent = "Beautiful";
break;
default:
messageContent = "No message";
break;
}
System.out.println(messageContent);
}
}
从Java 14标准版开始,帮助解决了以上问题:
1. 新语法使用 -> 操作符,而不是我们习惯的冒号。没有 break 关键字:您不需要 break 语句来防止失败。
public class SwitchExpression1After14 {
public static void main(String[] args) {
Integer messageNumber = 1;
switch (messageNumber) {
case 1 -> System.out.println("Tech");
case 2 -> System.out.println("Is");
case 3 -> System.out.println("Beautiful");
default -> System.out.println("No message");
}
}
}
代码输出:
2. 我们还建议每个案例允许多个变量,用逗号分隔。这有助于我们将多个有效表达式组合到同一个代码块中。避免创建多段相同的代码
public class SwitchExpression2After14 {
public static void main(String[] args) {
Integer messageNumber = 4;
switch (messageNumber) {
case 1 -> System.out.println("Tech");
case 2 -> System.out.println("Is");
case 3, 4 -> System.out.println("Beautiful");
default -> System.out.println("No message");
}
}
}
代码输出:
3.使用“yield”关键字处理switch表达式的每种情况下的业务逻辑。它接受一个参数,即“case”标签在 switch 表达式中产生的值。它将返回我们期望的值:
public class SwitchExpression3After14 {
public static void main(String[] args) {
Integer messageNumber = 4;
String messageContent = switch (messageNumber) {
case 1 -> "Tech";
case 2 -> "Is";
case 3 -> "Beautiful";
case 4 -> {
String firstMessage = "Expression";
String lastMessage = "Switch";
String fullMessage = firstMessage + lastMessage;
yield fullMessage;
}
default -> "No message";
};
System.out.println(messageContent);
}
}
代码输出:
新的 switch 表达式的好处包括由于没有失败行为而减少了错误的范围。
我们可以将 switch 表达式分配给变量,或者将它们放置在 Java 代码中需要表达式的任何位置。
#2 有用的 NullPointerExceptions
Java 14 通过准确显示哪个变量为空来帮助开发人员了解导致 NullPointerException 的原因。我们可以通过下面的代码看出区别:
public class NullPointerExceptions {
public static void main(String[] args) {
List<String> citys = null;
System.out.print(citys.size());
}
}
Java 14 之前的输出:
不使用调试器很难确定哪个变量为空。此外,JVM 只会打印出导致异常的方法、文件名和行号。
Java 14 之后的输出:
它通过更清晰地将动态异常与静态程序代码关联起来,极大地提高了程序的理解。
#3 “instanceof”的模式匹配(预览版)
通常,在使用 Java 开发应用程序时。对于应用程序,当我们需要处理某种类型的类,但我们有超类类型的引用时,我们需要检查该实例的类型。如果结果为真,下一步是将其转换为我们用来比较它的类型
下面这段代码有一个重复:compareToType — ifTrue — castToType。
public class InstanceofWithPatternMatchingBefore14 {
public static void main(String[] args) {
Object obj = "Tech is beautiful";
if (obj instanceof String) {
String s = (String) obj;
if (s.length() > 5) {
System.out.println(s.toUpperCase());
}
} else if (obj instanceof Integer) {
Integer i = (Integer) obj;
System.out.println(i);
}
}
}
代码输出:
“instanceof”运算符在 Java 14 中进行了改进,以测试参数并将其分配给具有适当类型的绑定变量。
在“instanceof”语句之后,我们现在可以指定一个变量名。如果 object 是指定类型,则绑定到新的变量名;然后这个新变量是指定的目标类型并且在“then 块”中可见。
public class InstanceofWithPatternMatchingAfter14 {
public static void main(String[] args) {
Object obj = "Tech is beautiful";
if (obj instanceof String s) {
if (s.length() > 5) {
System.out.println(s.toUpperCase());
}
} else if (obj instanceof Integer i) {
System.out.println(i * i);
}
}
}
结果也将返回相同的
这是一个语言功能,可以帮助进一步减少冗长,从而减少错误的可能性。
#4 记录(预览)
通常,要声明一个不可变类,我们会:
- 将这个类声明为 final,这样任何类都不能从它扩展。
- 将该类的字段声明为 private 和 final
- 没有 Setter 方法,只有 Getter 方法
- 如果该类的其中一个字段是对象,那么当我们获取该字段的信息时,我们需要返回该对象的副本。
下面是一个不可变类的示例。
public final class Employee {
private final String name;
private final int age;
private final String department;
public Employee(String name, int age, String department) {
this.name = name;
this.age = age;
this.department = department;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public String getDepartment() {
return department;
}
@Override
public String toString() {
return "Employee{" +
"name=" + name +
", age=" + age +
", department='" + department + '\'' +
'}';
}
@Override
public boolean equals(Object o) {
return true;
}
@Override
public int hashCode() {
return Objects.hash(name, age, department);
}
}
从 Java 14 开始,我们可以通过在声明类时使用 record 关键字来更快、更简单地做到这一点。除了构造函数和 getter 之外,此功能还会自动生成“equals”、“hashCode”和“toString”的实现。
我们只需要一行代码就可以实现上面的不可变“Employee”类,如下:
public record Empployee(String name, int age, String deparment) {}
现在,我们可以初始化并获取一个 Employee 对象的信息,如下所示:
public class Record14 {
public record Employee(String name, int age, String department) {}
public static void main(String[] args) {
Employee employee = new Employee("Anonymous", 30, "Technical");
System.out.println("Name: " + employee.name);
System.out.println("age: " + employee.age);
System.out.println("department: " + employee.department);
}
}
代码输出:
此功能遵循减少 Java 冗长并帮助开发人员编写更简洁的代码的趋势。
#5 文本块(第二次预览)
以前,在Java中声明多行文本时,我们通常会这样做:
public class NoneTextBlock {
public static void main(String[] args) {
String noneTextBlock = "This is TechisBeautiful \n" +
"Welcome my blog";
System.out.println(noneTextBlock);
}
}
代码输出:
文本块可以更轻松地处理多行字符串。我们可以使用三个双引号字符(“””)在 Java 中声明多行字符串
public class TextBlock {
public static void main(String[] args) {
String textBlock = """
This is TechisBeautiful
Welcome my blog
""";
System.out.println(textBlock);
}
}
它允许我们包含 HTML、JSON 或任何我们需要的文字片段
它还提供了两种添加方法来支持文本块。
- \<end-of-line>禁止行终止。
- \s被翻译成一个空格。
概括
这些是 Java 14 中前 5 个重要特性。我希望这篇文章能帮助你理解其中的一些新特性。当然也欢迎加入在留言区一起交流!
文章来源:博客园