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)