BethEvans《I Really Didn't Think This Through》作品简介与读书感悟

Java14预定于3月17日发布。那么,14版究竟有什么新功能,对于整天写代码、维护代码的Java开发者来说,哪些功能最有用呢?译者|弯月,责编|郭芮出品|CSDN(ID:CSDNnews)以下为译文

Java 14预定于3月17日发布。那么,14版究竟有什么新功能,对于整天写代码、维护代码的Java开发者来说,哪些功能最有用呢?

译者 | 弯月,责编 | 郭芮

出品 | CSDN(ID:CSDNnews)

以下为译文:

第14版包含的JEP(Java Enhancement Proposals,Java增强提案)比12版和13版加起来还要多。在这篇文章中,我将主要讨论以下几点:

改进的switch表达式,第一次出现在Java 12和13中,在Java 14中获得了完全的支持

读书笔记: 书名:童年 作者:高尔基 好词 瑗际 歪斜凌乱 灰雾茫茫 轻声慢语 胆怯 不知所措 软塌塌 澄澈 耸向 独树一帜 难以置信 琐事 矗立 与人为善 不折不扣 不动声色 窥伺 掩面而笑 绵绵不断 不为所动 好句 1.我看着他好。

instanceof支持模式匹配(语言特性)

PointerException(JVM特性)

希望你在阅读完本文后,city,积极地代码中实验这些功能,为Java团队提供反馈,并为Java的发展做出贡献。

Switch表达式

在之前的发布中,switch表达式只是一个“预览”阶段的特性。我想提醒一下,“预览”阶段的特性的目的是为了收集反馈,这些特性可能会随时改变,根据反馈结果,这些特性甚至可能会被移除,但通常所有预览特性最后都会在Java中固定下来。

新的switch表达式的优点是,不再有缺省跳过行为(fall-through),更全面,而且表达式和组合形式更容易编写,this,因此出现bug的可能性就更低。例如,switch表达式现在可以使用箭头语法,如下所示:

var log = switch (event) {

love,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;

}

};

文本块

Java 13引入的一个预览功能是文本块。有了文本块,多行的字符串字面量就很容易编写了。这个功能在Java 14中进行第二次预览,而且发生了一些变化。例如,多行文本的格式化可能需要编写许多字符串连接操作和转义序列。下面的代码演示了一个HTML的例子:

String html = "<HTML>" +

"\n\t" + "<BODY>" +

"\n\t\t" + "<H1>\"Java 14 is here!\"</H1>" +

"\n\t" + "</BODY>" +

"\n" + "</HTML>";

有了文本块,就可以简化这一过程,只需使用三引号作为文本块的起始和结束标记,就能编写出更优雅的代码:

String html = """

<HTML>

<BODY>

<H1>"Java 14 is here!"</H1>

</BODY>

</HTML>""";

Java 14引入了两个新的转义序列。第一,可以使用新的 \s 转义序列来表示一个空格。第二,可以使用反斜杠 \ 来避免在行尾插入换行字符。这样可以很容易地在文本块中将一个很长的行分解成多行来增加可读性。

例如,现在编写多行字符串的方式如下:

String literal =

"Lorem ipsum dolor sit amet,consectetur adipiscing " +

"elit,sed do eiusmod tempor incididunt ut labore " +

"et dolore magna aliqua.";

在文本块中使用 \ 转义序列,就可以写成这样:

String text = """

Lorem ipsum dolor sit amet,I,consectetur adipiscing \,

elit,sed do eiusmod tempor incididunt ut labore \

et dolore magna aliqua.\

""";

instanceof的模式匹配

Java 14引入了一个预览特性,有了它就不再需要编写先通过instanceof判断再强制转换的代码了。例如,下面的代码:

if (obj instanceof Group) {

Group group = (Group) obj;

// use group specific methods

var entries = group.getEntries;

}

BethEvans《I Really Didn't Think This Through》作品简介与读书感悟

利用这个预览特性可以重构为:

if (obj instanceof Group group) {

var entries = group.getEntries;

}

由于条件检查要求obj为Group类型,为什么还要像第一段代码那样在条件代码块中指明obj为Group类型呢?这可能会引发错误。

这种更简洁的语法可以去掉Java程序里的大多数强制类型转换。(2011年的一篇针对相关语言特性的研究论文()指出,24%的类型转换都来自于instanceof后的条件语句。)

JEP 305解释了这项改变,并给出了Joshuoa Bloch的著作《Effective Java》中的一个例子,演示了下面两种等价的写法:

@Override public boolean equals(Object o) {

return (o instanceof CaseInsensitiveString) &&

((CaseInsensitiveString) o).s.equalsIgnoreCase(s);

}

这段代码吗中冗余的CaseInsensitiveString强制类型转换可以去掉,转换成下面的方式:

@Override public boolean equals(Object o) {

return (o instanceof CaseInsensitiveString cis) &&

cis.s.equalsIgnoreCase(s);

}

这个预览特性很值得尝试,因为它打开了通向更通用的模式匹配的大门。模式匹配的思想是为语言提供一个便捷的语法,根据特定的条件从对象中提取出组成部分。这正是instanceof操作符的用例,因为条件就是类型检查,提取操作需要调用适当的方法,或访问特定的字段。

换句话说,该预览功能仅仅是个开始,以后该功能肯定能够减少更多的代码冗余,从而降低bug发生的可能性。

Record

另一个预览功能就是record。与前面介绍的其他预览功能一样,这个预览功能也顺应了减少Java冗余代码的趋势,能帮助开发者写出更精准的代码。Record主要用于特定领域的类,它的位移功能就是存储数据,而没有任何自定义的行为。

我们开门见山,举一个最简单的领域类的例子:BankTransaction,它表示一次交易,包含三个字段:日期,金额,以及描述。定义类的时候需要考虑多个方面:

构造器

getter方法

toString

hashCode和equals

这些部分的代码通常由IDE自动生成,而且会占用很大篇幅。下面是生成的完整的BankTransaction类:

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;

BethEvans《I Really Didn't Think This Through》作品简介与读书感悟

}

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 ==|| 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);

}

}

public record BankTransaction(LocalDate date。

double amount。

String description) {}

通过record,可以“自动”地得到equals,hashCode和toString的实现,还有构造器和getter方法。

要想尝试这个例子,需要用preview标志编译该文件:

javac --enable-preview --release 14 BankTransaction.java

如果你有兴趣阅读更多关于record的内容,可以阅读Ben Evans最近在《Java Magazine》上发表的文章()。

请继续关注该功能。从培养新一代的Java开发者的视角来看,Record也很有意思。例如,如果你要培养初级开发者,那么record应该什么时候讲呢?是在讲OOP之前还是之后?

PointerException

一些人认为,抛出PointerException异常应该当做新的“Hello World”程序来看待,因为PointerException是早晚会遇到的。玩笑归玩笑,这个异常的确会造成困扰,因为它经常出现在生产环境的日志中,会导致调试非常困难,因为它并不会显示原始的代码。例如,如下代码:

var name = user.getLocation.getCity.getName;

在Java 14之前,你可能会得到如下的错误:

高尔基作品童年读书心得感受1 在寒假期间,我在空闲的日子里,有幸拜读了高尔基的小说《童年》。 马克西姆·高尔基的《童年》举世闻名,是高尔基的重要代表作。小说描写的是小阿廖沙在父亲死后,随母亲来到外公家居住的 故事 。阿廖沙的童。

Exception in thread "main" java.lang.PointerException

at PointerExample.main(PointerExample.java:5)

作者自称“1924年以前不太懂俄语,而双目夫明前也只上过一年函授共产主义大学:因作品塑造了保尔·柯察金这个有着钢铁般意志的共产主义战土的形象和作家自身经历的传奇品质,《钢铁是怎样炼成的》成为世界革命青年成才的“教科书”和“圣经”。

不幸的是,如果在第5行是一个包含了多个方法调用的赋值语句(如getLocation()和getCity()),那么任何一个都可能会返回。实际上,变量user也可能是。因此,无法判断是谁导致了PointerException。

在Java 14中,新的JVM特性可以显示更详细的诊断信息:

Exception in thread "main" java.lang.PointerException: Cannot invoke "Location.getCity" because the return value of "User.getLocation" is

at PointerExample.main(PointerExample.java:5)

该消息包含两个明确的组成部分:

后果:Location.getCity无法被调用

原因:User.getLocation的返回值为

增强版本的诊断信息只有在使用下述标志运行Java时才有效:

-XX:+ShowCodeDetailsInExceptionMessages

下面是个例子:

java -XX:+ShowCodeDetailsInExceptionMessages PointerExample

在以后的版本中,该选项可能会成为默认。

这项改进不仅对于方法调用有效,其他可能会导致PointerException的地方也有效,包括字段访问、数组访问、赋值等。

总结

Java 14提供了几个新的预览版语言特性和更新,能很好地帮助开发者完成日常工作。Java 14还引入了record,这是一种创建精确数据类的新方法。此外,PointerException的消息经过了改进,能显示明确的诊断信息。switch表达式也成了Java 14的一部分。文本块功能可以帮你处理多行字符串,这是在引入了两个新的转义序列之后的另一预览功能。还有一项改动就是JDK Flight Recorder的事件流。

可见,Java 14带来了许多创新。你应该尝试一下这些功能,然后反馈给Java的开发团队。

本文为 CSDN 翻译,转载请注明来源出处。

上一篇 2023年02月04 00:55
下一篇 2022年12月24 20:59

相关推荐

  • 坐标图怎么画,坐标图Excel

    [好玩的数学]按:前天分享了一篇几何画板画图的文章——用几何画板怎么作不规则图形的阴影部分?收到很多读者的留言,有各种问题,其中也有几何画板的高手在帮忙回答问题。今天再分享一篇刘瑞祥老师关于用几何画板

    2023年01月16 223
  • 温暖的话,很暖很治愈的短句

    1、等我过了这个坎,我就要开心起来,一切都会变好的,超好,爆好,无敌好。2、人生的奔跑,不在于瞬间的爆发,取决于途中的坚持。你纵有千百个理由放弃,却也总会找一个理由坚持下去。很多时候,成功就是多坚持一

    2022年12月09 206
  • Wood,ChristopherS.编《Vienna School Reader》作品简介与读书感悟

    TheAngeloftheBirdsFranzDvorak(1910)UploadedTuesday,22October2013bymemberIrenePublicdomain美会在凝视者的眼睛里。

    2022年12月17 277
  • 英雄故事读后感,英雄故事读后感100字

    前几天,闲着无聊,打开电视机,刚好是电影《英雄》,由于看过的时间久远了,于是就饶有兴致的看了起来。影片剧终了,我思潮起伏,一个念头涌出:何为英雄?记得曾经第一次看这部影片的时候也没有太多的想法啊,难道

    2022年12月12 239
  • 健康的英文,丰富而又健康的英文

    Unit1food[fu:d]n.食物drink[drɪŋk]n.饮料、饮品candy['kændɪ]n.糖果fruit[fru:t]n.水果meat[mi:t]n.肉vegetable['vedʒt

    2022年12月11 272
  • pdf怎么删除一页,pdf如何删页

    pdf怎么删除某一页方法一:风云pdf转换器风云pdf转换器是一款针对pdf的专用的软件,他的功能丰富,拥有着大量针对的pdf的功能,其中自然也就包括了pdf的整合和拆分,我们来看看是如何完成的。我们

    2023年02月04 202
  • 瑜伽证书怎么考,考瑜伽证需要会瑜伽吗

    瑜伽教练证书有哪些,报考需要什么条件?对瑜伽行业有所了解的人都知道,如果想要做一名专业的瑜伽教练的话,瑜伽教练资格证是必要的条件之一,那么考瑜伽教练行业证书需要具备哪些条件呢?其实条件很简单,需要身体

    2023年01月30 227
  • 毕业感言一句话,毕业感言简短100字

    01离别时,愿诸事顺利来路总有潮起潮落那才是人生旅途的意义02可曾记得高中某个安静的傍晚教室里空荡荡这里等待着新的一批人1、几载青春,几载情谊,同学少年总相忆。2、流水匆匆,岁月匆匆,唯有友情永存心中

    2022年12月10 251
  • 米字符号怎么打,特殊符号米字

    单位换算题是小学数学学习重点之一。孩子对单位换算记忆不够深刻,所以总是混淆运用,特殊符号米字,绕来绕去会出现计算失误,进率错误等问题。单位换算大全来啦,还有记忆窍门,就算是小马虎也能一目了然,熟记于心

    2023年01月23 214
  • 怎样和父母沟通,学生与父母沟通的方法和技巧

    父母的观念不是你塑造的,是他们在几十年的人生里,学生与父母沟通的方法和技巧,通过一件件遇到的事、一个一个交往的人总结出的。甚至是你父母的父母在他童年时给他植下的,根深蒂固,不可改变。其实,父母做的一切

    2022年12月28 207
  • 好词大全,小学生摘抄好句

    写好作文不是一蹴而就的事,做好每天积累很关键,今天为大家整理了小学生写作中能运用到的词语大全,一定会让孩子在考试中运用到,只要积累好,提高作文分数手到擒来,家长快为孩子收藏吧!小学生摘抄好句,1.带有

    2022年12月10 203
  • 除法怎么算,÷法怎么学

    二年级数学知识点:除法的知识点下面来几道常考类型题练练吧若ab=c(b≠0),用积数c和因数b来求另一个因数a的运算就是除法,写作c÷b,读作c除以b(或b除c)。其中,c叫做被除数,b叫做除数,运算

    2023年01月15 249
  • 怎样画鸡蛋,儿童简笔画鸡蛋

    -01--02-运用切角的方法细化鸡蛋的边缘,在每条边线的三分之一处取一个点,然后连接两侧的点,将四角切掉。-03-继续切角,细化边缘轮廓,让边缘变的圆润起来。1、首先,在纸张上画好鸡蛋的外形,注意上

    2023年01月01 263
关注微信