Java的新未来:逐渐“Kotlin化,全栈系统化的学习路线

????????????????'}';

????}

}

它所包含的 **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://kotlinlang.org/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://kotlinlang.org/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.coding.net/public/P7/Java/git)**

还有更多Java笔记分享如下:

![image](https://upload-images.jianshu.io/upload_images/22459064-4cc2f9e85b985e30.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
(0)

相关推荐