[注]本文翻译回:Java 11和Java 17之间的新内容?
Java 17于9月14日发布。现在是时候仔细研究自上述LTS版本以来的更改(即Java 11)。LET的简短介绍了许可模型,然后专注于Java 11和Java 17之间的一些更改。,主要通过示例。
首先,让我们仔细研究Java许可证和支持模型。Java17是LTS(长期支持)版本,就像Java 11.Java 11.Java 11启动了新版本Rhythm.java 11支持直到2023年9月,将支持扩展到直到2026年9月。此外,在Java 11中,Oracle JDK不再用于免费生产和商业目的。每6个月发布一次新版本的Java,So -so all -lts发行版,从Java 12到Java 16。您可能会升级到Java 13。当您的某些依赖项尚未准备好Java 13时,这可能会导致一些问题。在大多数情况下,该公司将等待LTS版本进行生产。但是,即使如此,有些公司也不愿意不愿意升级。最近对SNYK的调查显示,只有60%的人在Productio中使用Java 11n,从Java 11!60%的公司发行的3年已经过去了,仍在使用Java。Java 17中图书馆的好摘要,您可以在这里找到它。
随着Java 17的发布,Oracle许可模式已更改。Java17根据新的NFTC(免费条款和条件)允许发布。因此,允许Oracle JDK版本使用Oracle JDK版本进行生产和商业在同一SNYK调查中,有些人指出,Oracle JDK版本仅在生产环境中使用了23%的用户。请注意,LTS版本的支持将在下一个LTS版本发布后结束请参阅这将如何影响升级到下一个LTS版本。
Java 11和Java 17之间发生了什么?您可以在OpenJDK网站上找到JEP(Java Enhancement Proum)的完整列表。Java 11,Oracle发行说明提供了一个很好的摘要。
在下一部分中,将通过示例解释一些更改,但这主要取决于您对这些新功能的测试以熟悉它们。本文中使用的所有资源都可以在GitHub上找到。
最后一件事是Oracle发布了Dev.java,所以不要忘了看它。
为了使Java更具可读性和简单性,已经进行了许多改进。毫无疑问,该块使代码更可读。首先,让我们查看问题。请提高您需要一些JSON字符串到您的代码,您需要打印它在此代码中有几个问题:
上述代码的输出是一个很好的格式JSON。
文本块由三个双引号定义,其中末尾的三个双引号不能与起始行相同。首先,只需打印一个空块。双管。
输出是:
JSON部分可以按照以下方式写出的问题,因此可读性更好。它不需要是双引号,看起来它将被打印。
输出当然是相同的。
在上一个输出中,没有以前的空间。但是,在代码中,前面有一个空间。如何确定前面的空间?首先,将三个双引号移动到左侧。
现在,输出在每行之前打印两个空间。这意味着末尾的三个双引号表示文本块的开头。
当您最后移动三个双引号时会发生什么?
现在,前距离由文本块中的第一个非空字符确定。
Switch表达式将使您能够从交换机返回值,并在分配中使用这些返回值。在此处显示经典交换机。其中,根据给定的水果枚举价值,需要进行一些操作。故意破裂。
使用Apple调用此方法。
这将打印每种情况,因为没有断路声明,案件将失败。
因此,有必要在每种情况下添加一个断路声明,以防止这种失败。
运行此方法将为您提供所需的结果,但是代码的可读性现在稍差一些。
可以通过使用switch表达式来解决这一点。
这并不是那么尴尬,结果是相同的。
切换表达式也可以返回一个值。在上面的示例中,您可以返回字符串值并将其分配给变量文本。在该示例中,您可以打印文本变量。不要忘记在最后一个情况之后添加段编号。
此外,简而言之是可以用语句重写上述内容。这是否比上面取决于您更可读。
如果您需要做什么以外的事情,您将做什么?在这种情况下,可以使用方括号来表示案例块并在返回值时使用关键字收益率。
输出有些不同,并且执行了两个打印语句。
您可以在“旧”开关语法中使用屈服关键字。此处不需要断裂。
记录将允许您创建不变的数据类。在目前,您需要使用IDE的自动生成函数创建grapeclass,以生成相同的目标来生成构造函数,getter,getter,hashcode,equals和tostring,或者您可以使用Lombok来使用Lombok实现相同的目的。最终,您将获得一些模型代码,否则您的项目最终将依靠Lombok。
使用上述葡萄胶类进行一些测试。创建两个示例,打印它们,比较它们,创建副本并进行比较。
测试的输出是:
Graperecord具有与GrapeClass相同的功能,但是它更简单。您创建记录并指出该字段应该是什么,然后完成。
可以在自己的文件中定义记录,但是由于它非常紧凑,因此也可以将其定义在需要的位置。以下记录重写的测试如下:
输出与上述相同。注意记录的记录应以相同的副本结尾。添加其他功能,例如grape1.nbrofpits()进行一些处理并从最初的nbrofits是一种不好的方法。尽管这是允许的,但您不应该这样做。
可以通过一些字段验证扩展构造函数。请注意,该参数已分配给构造函数末尾的记录字段。
上述测试的输出显示了此功能。在构造函数内部,字段值仍然为null,但是当打印记录时,它们是值为值的。验证还可以执行该功能,当颜色为null时,IllegalArgumentException时被扔了。
密封类将使您能够更好地控制哪些类可以扩展您的类。密封类可能对图书馆所有者有用。可以在Java 11 Final中扩展一个类。如果您想控制哪个类可以扩展您的类别超级阶级,您可以将所有类放在同一包中,并提供超级案件的可见性。
在同一包装中创建公共可见性抽象的水果,最终的苹果和梨是创建的,它们已经扩展了水果。
使用问题空间方法创建一个SealedClasses.java文件。使用问题空间方法JAVA文件。您可以看到,您可以为Apple,Pear和Apple创建实例,您可以将Apple分配给Fruit。扩展的水果鳄梨类。
假设您不希望有人扩大水果。在这种情况下,您可以将水果的可见性更改为默认可见性(删除公共关键字)。当苹果分配给水果并创建鳄梨类时,上述代码不会被编译。后者需要,但我们真的想将苹果分配给水果。这可以在密封的Java 17中解决。
在com.mydeveloperplanet.myjava17planet.seyed中,创建了水果,苹果和梨的密封版本。唯一要做的是在水果类中添加密封的关键字,并使用允许的关键字可以扩展这种密封的类别。需要指出它们是最终,密封还是非密封的。欧拉类不能控制子类是否可以扩展以及如何扩展。
在密封级方法中,苹果关系仍然可以分配给液化,但鳄梨不允许膨胀果实。但是,由于此子类,苹果的扩张被认为是非交换的。
通常有必要检查对象是否属于某种类型。如果是这样,第一件事是将对象强制到特定类型的新变量。您可以在以下代码中看到一个示例:
输出是:
使用InstanceOf的模式匹配,可以按以下方式重写以下内容。您可以看到,可以在Instance Off Inspections中创建变量,并且不再需要使用来创建新的变量和转换对象的提取。
输出当然与上述相同。
仔细检查变量的范围很重要。它不应模棱两可。在以下代码中,&&之后的条件仅在instance of instance of of true结果时才能进行评估。因此,这是允许的。变更&& change && to | ||不编译。
以下代码显示了范围的另一个示例。如果对象不是grapeclass类型,请投掷RuntimeException。在这种情况下,您将永远不会达到打印句子。在这种情况下,您也可以使用葡萄变量,因为编译器必须知道那个葡萄存在。
有用的NullPoInterException将为您节省一些有价值的分析时间。以下代码导致NullPoInterException。
对于Java 11,输出将显示NullPoInterException中发生的线号,但是您不知道哪种链方法被解析为NULL。您必须通过调试发现自己。
在Java 17中,相同的代码将生成以下输出,该输出准确地显示了NullPoInterException的位置。
根据Unicode标准,将工厂方法添加到NumberFormat中,以紧凑型和人类可读形式的形式格式化数字。Short格式样式如下所示:
输出是:
长格式样式:
输出是:
输出是:
添加用于格式化日期的新模式B,该模式B表示Unicode标准指令的日期期。
使用默认的中文环境在当天打印几次:
输出是:
现在使用荷兰当地环境:
输出如下。请注意,英国之夜从23岁开始,荷兰之夜从01开始。这可能是文化上的差异;-)。
为了将流转换为列表,您需要使用collectors.tolist()collect的方法。这是非常冗长的,如下面的示例所示。
在Java 17中,添加了一种宽容方法来替换旧行为。
在本文中,您迅速浏览了自上一版版本Java 11以来添加了一些功能。现在您开始考虑迁移到Java 17的计划,并了解有关这些新功能的更多信息,以及如何将它们应用于您的每日编码习惯。提交:Intellij将帮助您解决此问题!