????????????????'}'; ????} } 它所包含的 **Address** 对象如下所示: package?com.theboreddev.java14; import?java.util.Objects; public?class?Address?{ ????private?final?String firstLine; ????private?final?String secondLine; ????private?final?String postCode; ????public?Address(String firstLine, String secondLine, String postCode)?{ ????????this.firstLine = firstLine; ????????this.secondLine = secondLine; ????????this.postCode = postCode; ????} ????public?String?getFirstLine()?{ ????????return?firstLine; ????} ????public?String?getSecondLine()?{ ????????return?secondLine; ????} ????public?String?getPostCode()?{ ????????return?postCode; ????} ????@Override? ????public?boolean?equals(Object o)?{ ????????if?(this?== o)?return?true; ????????if?(o ==?null?|| getClass() != o.getClass())?return?false; ????????Address address = (Address) o; ????????return?Objects.equals(firstLine, address.firstLine) && ????????????????Objects.equals(secondLine, address.secondLine) && ????????????????Objects.equals(postCode, address.postCode); ????} ????@Override? ????public?int?hashCode()?{ ????????return?Objects.hash(firstLine, secondLine, postCode); ????} ????@Override? ????public?String?toString()?{ ????????return?"Address{"?+ ????????????????"firstLine='"?+ firstLine +?'''?+ ????????????????", secondLine='"?+ secondLine +?'''?+ ????????????????", postCode='"?+ postCode +?'''?+ ????????????????'}'; ????} } 为了完成一件简单的事情,我们写了太多的代码,对不对? 接下来,我们看一下使用新的 Java record 之后,代码会是什么样子: public?record?EmployeeRecord(String firstName, String surname,?int?age, AddressRecord address,?double?salary)?{ } 再看一下 **Address** 类: public?record AddressRecord(String?firstLine,?String?secondLine,?String?postCode) { } 这和我们前面所编写的一大堆代码是同样的效果,我们不得不承认:这非常棒!从要保存的代码数量和简洁性方面都是如此。 现在我们看看新的 switch 语句有什么不同。 改善 switch 语句 新的 switch 语句解决了在 Java 中使用 switch 语句的一些固有问题。**我们一直以来都被教导应该避免使用 switch 语句,因为它们很容易出错并会导致代码重复** 。举例来说,我们很容易遇到某个 case 条件覆盖不到的场景。 新的 switch 语句解决了这个问题,因为如果我们的 switch 语句没有涵盖我们传递给它的领域类型的所有范围,它就无法编译通过。 为了阐述该例子,我们使用 Java 创建一个 **DayOfTheWeek** 枚举: public?enum?DayOfTheWeek { ????MONDAY, ????TUESDAY, ????WEDNESDAY, ????THURSDAY, ????FRIDAY, ????SATURDAY, ????SUNDAY } 我们需要 switch 语句告诉我们每周的某一天所对应的位置。看一下通过 Java 11 该怎么实现: final DayOfTheWeek dayOfTheWeek = DayOfTheWeek.THURSDAY; ????????int?position =?0; ????????switch?(dayOfTheWeek) { ????????????case?MONDAY: ????????????????position =?1; ????????????????break; ????????????case?TUESDAY: ????????????????position =?2; ????????????????break; ????????????case?WEDNESDAY: ????????????????position =?3; ????????????????break; ????????????case?THURSDAY: ????????????????position =?4; ????????????????break; ????????????case?FRIDAY: ????????????????position =?5; ????????????????break; ????????????case?SATURDAY: ????????????????position =?6; ????????????????break; ????????????case?SUNDAY: ????????????????position =?7; ????????????????break; ????????} ????????System.out.println("Day "?+ dayOfTheWeek +?" is in position "?+ position +?" of the week"); 使用原来的 switch 语句时,我们必须要使用一个变量,而且如果我们遗漏了一周中的某一天,代码也能编译通过。这就是 switch 语句的问题之一,非常容易出错。 Java 14 会怎样改善这种情况呢?我们快速看一下: final DayOfTheWeek dayOfTheWeek = DayOfTheWeek.THURSDAY; ????????int?position =?switch?(dayOfTheWeek) { ????????????case?MONDAY ->?1; ????????????case?TUESDAY ->?2; ????????????case?WEDNESDAY ->?3; ????????????case?THURSDAY ->?4; ????????????case?FRIDAY ->?5; ????????????case?SATURDAY ->?6; ????????????case?SUNDAY ->?7; ????????}; ????????System.out.println("Day "?+ dayOfTheWeek +?" is in position "?+ position +?" of the week"); 我们可以看到, **新的 switch 语句可以用作表达式,而不仅仅是语句** 。 这样带来的结果就是更加简洁,也更具有表述性,这就足以说服我们使用它了。但是,现在的 switch 还有一个重要改善,那就是如果在 switch 中没有涵盖所有 case 的话,它将无法编译通过。它会显示如下错误: Error:(9,?24) java:?the switch expression does not cover?all?possible?input?values 现在,我们不会在 switch 语句中遗漏 case 了,这是一项非常棒的特性。 这非常类似于 Kotlin 的 **when** 语句,你可以通过下方链接了解该语句的更多信息。 https:///docs/reference/control-flow.html 接下来,我们看一下文本块。 文本块 你有没有遇到过将一个大的 blob JSON 赋值给 Java 变量的场景?你是否也受够了这种丑陋的代码?Java 将会引入多行字符串特性,我们可以通过将它们 **封装在三重引号** 中来定义它们。当这个功能被正式发布后,定义多行长字符串会更加容易。 我们来看一下两种模式的差异。假设我们想要将一个格式化后的 JSON 存储到一个变量中,那么丑陋的代码如下所示: final?String text =?"{"widget": {\n"?+ ????????????????" "debug": "on",\n"?+ ????????????????" "window": {\n"?+ ????????????????" "title": "Sample Konfabulator Widget",\n"?+ ????????????????" "name": "main_window",\n"?+ ????????????????" "width": 500,\n"?+ ????????????????" "height": 500\n"?+ ????????????????" },\n"?+ ????????????????" "image": { \n"?+ ????????????????" "src": "Images/Sun.png",\n"?+ ????????????????" "name": "sun1",\n"?+ ????????????????" "hOffset": 250,\n"?+ ????????????????" "vOffset": 250,\n"?+ ????????????????" "alignment": "center"\n"?+ ????????????????" },\n"?+ ????????????????" "text": {\n"?+ ????????????????" "data": "Click Here",\n"?+ ????????????????" "size": 36,\n"?+ ????????????????" "style": "bold",\n"?+ ????????????????" "name": "text1",\n"?+ ????????????????" "hOffset": 250,\n"?+ ????????????????" "vOffset": 100,\n"?+ ????????????????" "alignment": "center",\n"?+ ????????????????" "onMouseUp": "sun1.opacity = (sun1.opacity / 100) * 90;"\n"?+ ????????????????" }\n"?+ ????????????????"}} "; 在新的多行字符串功能发布之后,我们就可以更容易地编写整洁的代码了: final String multiLineText =?""" ????????????????{"widget": { ????????????????????"debug":?"on", ????????????????????"window": { ????????????????????????"title":?"Sample Konfabulator Widget", ????????????????????????"name":?"main_window", ????????????????????????"width":?500, ????????????????????????"height":?500? ????????????????????}, ????????????????????"image": {\s ????????????????????????"src":?"Images/Sun.png", ????????????????????????"name":?"sun1", ????????????????????????"hOffset":?250, ????????????????????????"vOffset":?250, ????????????????????????"alignment":?"center"? ????????????????????}, ????????????????????"text": { ????????????????????????"data":?"Click Here", ????????????????????????"size":?36, ????????????????????????"style":?"bold", ????????????????????????"name":?"text1", ????????????????????????"hOffset":?250, ????????????????????????"vOffset":?100, ????????????????????????"alignment":?"center", ????????????????????????"onMouseUp":?"sun1.opacity = (sun1.opacity / 100) * 90;"? ????????????????????} ????????????????}} ????????????????"""; 我觉得这样好太多了。这也是 Kotlin 所支持的,可以在下方的类型定义中找到。 https:///docs/reference/basic-types.html 总之,我们能看到 Java 从它的竞争对手之一,也就是 Kotlin,那里“继承”了许多方案来解决自己的问题。我们不知道这次 Oracle 在对抗 Kotlin 的崛起方面是否及时做出了正确的反应,或许这有点太晚了。但我个人认为 Java 正在朝着正确的方向前进,尽管这些变化是由它的竞争对手以某种方式触发的,而且可能来得有点迟了。 如前所述,如果这篇文章激发了你学习 Kotlin 语言的兴趣,我建议你阅读“ Kotlin in Action”,对于 Java 开发人员来说,这是一门很棒的 Kotlin 入门图书。 ? ? 结论? ?? 我认为竞争是 Java 语言有史以来所遇到的最好的事情。如果不这样,Java 就会作茧自缚。Java 的竞争对手也表明了不同的编程方式是可行的,它表明了前进的方向,并让我们避免使用老式的、陈旧的编写代码方式。 我最近在 Java 中看到了一些变化,以及所有即将发布的特性和改善,它们正在使 Java 变得比以往任何时候都更强大。它是一种适应当前时代的语言,一种希望发展并忘记传统做事方式的语言:**Java 的新未来!** ## 最后 以上全部分布式技术专题+面试解析+相关的手写和学习的笔记pdf **[CodeChina开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频】](https://ali1024./public/P7/Java/git)** 还有更多Java笔记分享如下:  |
|
来自: 昵称75895347 > 《待分类》