当前位置: 主页 > JAVA语言

java转义符-java冒号转义

发布时间:2023-05-25 10:09   浏览次数:次   作者:佚名

java转义符_java特殊符号转义_java冒号转义

作者 | Raoul-Gabriel Urma

策划 | 小智

Java 版本更新如此稳定,竟有些不习惯了……

Java 14 计划于 3 月 17 号发布。这一版本包含的 JEP 比 Java 12 和 Java 13 的总和还要多。那么,对于每天需要面对 Java 代码的开发者来说,哪些东西最值得关注?

本文将着重介绍以下这些 Java 新特性

1 switch 表达式

java特殊符号转义_java转义符_java冒号转义

在 Java 14 中,switch 表达式是一个正式的特性。而在之前的两个 Java 版本中,这个特性只是预览版。设定“预览版”的目的是为了收集开发者反馈,并根据反馈结果决定相应的特性是否要做出修改,甚至是移除,但其中的大部分都会成为正式特性。

新的 switch 表达式有助于减少 bug,因为它的表达和组合方式更容易编写。例如,下面的示例使用了箭头语法

var log = switch (event) {    case PLAY -> "User has triggered the play button";    case STOP, PAUSE -> "User needs a break";    default -> {        String message = event.toString();        LocalDateTime now = LocalDateTime.now();        yield "Unknown event " + message +               " logged on " + now;    }};

2 文本块

Java 13 引入了文本块特性,并将其作为预览版。有了这个特性,处理多行字符串字面量就容易了很多。在 Java 14 中,该特性仍然是预览版,不过做了一些调整。在没有这个特性之前,要表示多行格式化的字符串需要像下面这样:

String html = "" +"\n\t" + "" +"\n\t\t" + "

\"Java 14 is here!\"

" +
"\n\t" + "" +"\n" + "";

java转义符_java冒号转义_java特殊符号转义

有了文本块特性之后,可以使用三引号来表示字符串的开头和结尾,这样的代码看起来更简洁、更优雅:

String html = """      

"Java 14 is here!"

""";

在 Java 14 中,该特性增加了两个转义字符。一个是\s,用来表示单空格。一个是反斜杠\,用在行末表示不换行。如果你有一个很长的字符串,为了让代码看起来更好看,但又不希望真的换行,就可以使用这个转义字符。

例如,目前的多行字符串是这样的:

String literal =          "Lorem ipsum dolor sit amet, consectetur adipiscing " +         "elit, sed do eiusmod tempor incididunt ut labore " +         "et dolore magna aliqua.";

使用了新的转义字符之后是这样的:

java特殊符号转义_java冒号转义_java转义符

String text = """                Lorem ipsum dolor sit amet, consectetur adipiscing \                elit, sed do eiusmod tempor incididunt ut labore \                et dolore magna aliqua.\                """;

3 instanceof 的模式匹配

为了避免在使用 instanceof 后还需要进行类型转换,Java 14 引入了一个新的预览版特性。例如,在没有该特性之前:

if (obj instanceof Group) {  Group group = (Group) obj;  // 调用group的方法  var entries = group.getEntries();}

我们可以使用新的特性来重写这段代码:

if (obj instanceof Group group) {  var entries = group.getEntries();}

java特殊符号转义_java冒号转义_java转义符

既然条件检查已经确认 obj 是 Group 类型,那为什么还要再次进行显式的类型转换呢?这样有可能更容易出错。新的语法可以将代码中的大部分类型转换移除掉。2011 年发布的一份研究报告显示,Java 代码中有 24% 的类型转换是跟在 instanceof 之后的。

Joshua Bloch 的经典著作《Effective Java》中有一段代码示例:

@Override public boolean equals(Object o) {     return (o instanceof CaseInsensitiveString) &&             ((CaseInsensitiveString) o).s.equalsIgnoreCase(s); }

这段代码可以使用新的语法写成:

@Override public boolean equals(Object o) {     return (o instanceof CaseInsensitiveString cis) &&            cis.s.equalsIgnoreCase(s); }

这个特性很有意思,因为它为更为通用的模式匹配打开了大门。模式匹配通过更为简便的语法基于一定的条件来抽取对象的组件,而 instanceof 刚好是这种情况,它先检查对象类型,然后再调用对象的方法或访问对象的字段。

java转义符_java特殊符号转义_java冒号转义

4 记录类(Record)

另一个预览特性是“记录”。该特性主要是为了降低 Java 语法的“啰嗦”程度java转义符,让开发者写出更简洁的代码。这个特性主要用在某些领域类上,这些类主要用于保存数据,不提供领域行为。

我们以一个简单的领域类 BankTransaction 作为例子,它包含了三个字段:date、amount 和 description。目前,这个类需要以下几个组件:

这些方法一般可以通过 IDE 自动生成,但会占用很大的代码空间,例如:

public class BankTransaction {    private final LocalDate date;    private final double amount;    private final String description;

public BankTransaction(final LocalDate date, final double amount, final String description) { this.date = date; this.amount = amount; this.description = description; }
public LocalDate date() { return date; }
public double amount() { return amount; }
public String description() { return description; }
@Override public String toString() { return "BankTransaction{" + "date=" + date + ", amount=" + amount + ", description='" + description + '\'' + '}'; }
@Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; BankTransaction that = (BankTransaction) o; return Double.compare(that.amount, amount) == 0 && date.equals(that.date) && description.equals(that.description); }
@Override public int hashCode() { return Objects.hash(date, amount, description); }}

Java 14 提供了一种方式java转义符,可以避免这种繁琐的代码,满足开发者希望一个类只是用来聚合数据的意图。BankTransaction 可以重构成:

public record BankTransaction(LocalDate date,                              double amount,                              String description) {}

除了构造器和 getter 方法,还会自动生成 equals、hashCode 和 toString 方法。