Java 10 中的新增功能

小夏 科技 更新 2024-01-30

局部变量类型推理是一个热门的、有争议的话题,但 J**A 10 为 JVM 中的垃圾回收和容器感知带来了一些可喜的变化。

你认为你懂JAA编程吗?事实是,大多数开发人员只触及了 JAA 平台的表面,并且只学到了足够的知识来完成工作。 在本系列中,J**a 技术侦探深入挖掘了 J**a 平台的核心功能,揭示了一些技巧和窍门,这些技巧和窍门将帮助您解决最棘手的编码挑战。

J**A 开发人员习等待新的 J**A 版本,但新的高频版本的节奏改变了这一点。 J**A 9 问世仅 6 个月后,J**A 10 就问世了。 再等 6 个月,我们将得到 J**A 11。 一些开发人员可能认为这个发布节奏太快了,但这个新的节奏标志着期待已久的变化。

就像它的版本号一样,J**A 10 提供了 10 个新功能,本文将介绍我认为最重要的 5 个(您可以在 Open JDK 的 10 个项目页面上看到所有新功能)。 从历史上看,JDK 的发布节奏是由重要的新功能驱动的。 在最近的案例中,J**A 8 以 lambda 表达式和流的形式引入了函数式编程,J**A 9 引入了模块化的 J**A 系统。 每个新版本都热切期待,而小的修复通常会被搁置一旁,等待更大组件的最终确定。 j**a 的发展落后于其他语言。

新的高频节奏会促使 J**A 在有小的改进时发布新版本。 在发布日期之前,新版本中包含现成的功能,未准备好的功能可以计划在 6 个月后的下一个版本中包含在中。 这个新周期中的第一个 j**a 版本是 j**a 9,它于 2017 年 10 月推出。 J**A 10 于 2018 年 3 月发布,J**A 11 预计将于 2018 年 9 月发布。

作为新节奏的一部分,甲骨文表示,它对每个主要版本的支持将只持续到下一个主要版本可用。 当 J**A 11 发布时,Oracle 将停止支持 J**A 10。 如果开发人员想要确保其 j**a 版本受支持,则需要每 6 个月迁移到一个主要版本。 不想或不需要经常迁移的开发人员可以使用 LTS(长期支持)版本,该版本每 3 年更新一次。 对当前 LTS 版本 (J**A 8) 的支持将于今年秋季 J**A 11 推出时结束。

局部变量类型推断是 J**a 10 中迄今为止最值得注意的功能。 这个特性是在 JDK 10 中引入的,它允许编译器推断局部变量的类型,而不是要求程序员显式指定变量类型。

清单 1 显示了在 j**a 10 之前如何定义它string变量类型。

清单 1声明并分配字符串变量。

string name = "alex";
show moreshow more icon

清单 2 给出了与 j**a 10 中定义的相同的结果string变量。

清单 2使用局部变量类型推断功能定义的字符串变量。

var name = "alex";
show moreshow more icon

如您所见,唯一的区别是使用了预留类型名称var。使用右侧的表达式,编译器可以推断变量name类型为:string

这可能看起来很简单,所以让我们看一个更复杂的例子。 如果将变量分配给方法调用的返回值,会发生什么情况?在这种情况下,编译器可以从方法的返回类型推断变量类型,如清单 3 所示。

清单 3从返回类型推断的字符串变量。

var name = getname();string getname()
show moreshow more icon

顾名思义,局部变量类型推断功能只能用于局部变量。 不能使用它来定义实例或类变量,也不能在方法参数或返回类型中使用它。 但是,在可以从迭代器推断类型的经典和增强的 for 循环中,您可以使用var如清单 4 所示。

清单 4在循环中使用 var

for(var book : books){}for(var i = 0; i < 10; i++)
show moreshow more icon

使用此类型的最明显原因是减少 **. 请看清单 5 中的示例。

清单 5长类型名称使 ** 更长。

string message = "incy wincy spider..."; stringreader reader = new stringreader(message); streamtokenizer tokenizer = new streamtokenizer(reader);
show moreshow more icon

请注意,我们使用保留的类型名称var重写清单 5 后发生了什么。

清单 6var 类型可减少冗余。

var message = "incy wincy spider..."; var reader = new stringreader(message); var tokenizer = new streamtokenizer(reader);
show moreshow more icon

清单 6 中的类型声明是垂直排列的,并且每个语句中只提到一次类型,位于构造函数调用的右侧。 想象一下,将此类型用于 j**a 框架中常见的长类名的一些好处。

1.var 模糊了类型,你已经知道了var可读性可以提高,但另一方面,它也有可能使类型模糊不清。 请看清单 7 中的示例。

清单 7返回类型不明确。

var result = searchservice.retrievetopresult();
show moreshow more icon

在清单 7 中,我们必须猜测返回类型。 要保持让读者猜测发生了什么的**就更难了。

2.var 不能与 lambda 一起使用,并且在 lambda 表达式中使用类型推断时效果不佳,主要是由于编译器缺少可用的类型信息。 清单 8 中的 lambda 表达式无法编译。

清单 8类型信息不足。

function quotify = m ->"'" + message + "'"; var quotify = m ->"'" + message + "'";
show moreshow more icon

在清单 8 中,右侧表达式中没有足够的类型信息供编译器推断变量类型。 Lambda 语句必须始终声明显式类型。

3.var 不能与菱形运算符一起使用,并且类型推断在与菱形运算符一起使用时效果不佳。 请看清单 9 中的示例。

清单 9将菱形运算符与 var 一起使用

var books = new arraylist<>(
show moreshow more icon

亲自试一试

要自行尝试局部变量类型推断,您需要 JDK 10 和支持它的 IDE。 IntelliJ 的 EAP(抢先体验计划)版本提供了这种支持。 安装这些工具后,您可以首先查看本文附带的 github 存储库。 您可以在此处找到局部变量类型推断的示例。 在清单 9 中,books引用arraylist参数类型是什么?您可能知道,您希望arraylist存储了书籍列表,但编译器无法推断这一点。 相反,编译器只会做它能做的事,即推断一个原因object类型参数化arraylistarraylist()

相反,请在右侧表达式的菱形运算符中指定类型。 然后,您可以让编译器根据该信息推断变量类型,如清单 10 所示。 否则,您必须以传统方式显式声明变量:list books。事实上,您可能更喜欢此选项,因为它允许您指定抽象类型和程序list接口:

清单 10指定类型。

var books = new arraylist();
show moreshow more icon

J**A 10 删除了一些工具:

命令行工具j**ah,但你可以使用它j**ac -h更换它。 命令行选项-x:prof,但你可以使用它jmap用于访问分析信息的工具。 policytool。有些是由于 j**a 12 标记为已弃用的 API,已被永久删除。 这些 API 包括:j**a.lang.securitymanager.incheck字段和以下方法:

j**a.lang.securitymanager.classdepth(j**a.lang.string)j**a.lang.securitymanager.classloaderdepth()j**a.lang.securitymanager.currentclassloader()j**a.lang.securitymanager.currentloadedclass()j**a.lang.securitymanager.getincheck()j**a.lang.securitymanager.inclass(j**a.lang.string)j**a.lang.securitymanager.inclassloader()j**a.lang.runtime.getlocalizedinputstream(j**a.io.inputstream)j**a.lang.runtime.getlocalizedoutputstream(j**a.io.outputstream)JDK 10 还弃用了一些 API。 j**a.security.acl该包被标记为已弃用j**a.security包中的各种相关类 (certificateidentityidentityscopesingerauth.policy事实也是如此。 另外j**ax.management.remote.rmi.rmiconnectorservercredential_types也标记为已弃用。 j**a.io.fileinputstreamj**a.io.fileoutputstreamfinalize()方法已标记为已弃用。 j**a.util.zip.deflaterinflaterzipfilefinalize()方法也是如此。

作为 Oracle JDK 与 Open JDK 持续协作的一部分,Open JDK 现在包括 Oracle JDK 中可用的根证书颁发机构的子集。 这些机构包括 J**a 飞行记录器和 J**A 任务控制中心。 此外,在j**a.textj**a.timej**a.util在适当的情况下,JDK 10 还增强了对 BCP 的 47 种语言标记的 Unicode 扩展的支持。 另一个新功能允许在不执行全局 VM 安全点的情况下进行进程执行。 这使得终止单个线程变得可行且经济,而无需终止所有线程或根本不终止任何线程。

如果要部署到 docker 等容器中,此功能特别适合您。 JVM 现在知道它正在容器中运行,并查询该容器中可供使用的处理器数量,而不是主机操作系统。 还可以从外部连接到容器中运行的 JVM 进程,这样可以更轻松地监视 JVM 进程。

以前,JVM 对其容器一无所知,并且会向主机操作系统询问活动 CPU 的数量。 在某些情况下,这可能会导致向 JVM 报告过多的资源,从而在多个容器在同一操作系统上运行时导致问题。 在 J**A 10 中,您可以将容器配置为使用主机操作系统的一部分 CPU,并且 JVM 能够确定正在使用的 CPU 量。 它也可以使用-xx:activeprocessorcount标志,它显式指定容器化 JVM 可以看到的处理器数。

此功能的目的是缩短运行之间的 JVM 引导时间,允许多个 JVM 运行相同的 **,同时减少内存占用。 这是通过在 JVM 之间共享有关类的元数据来实现的。 JVM 的第一次运行会收集并记录有关它所加载的类的数据。 然后,它使数据文件可供其他 JVM 和该 JVM 的后续运行使用,从而节省 JVM 初始化过程中的时间和资源。 类数据共享实际上已经存在了一段时间,但仅适用于系统类。 此功能现已扩展为包括所有应用程序类。

J**A 10 中最热门的功能显然是新的保留类型名称var。它澄清和简化了**,但如果使用不慎,它可能会模糊含义和意图。 当类型不明确时,IDE 可以帮助识别类型,但它不会将所有 ** 读入 IDE。 我们通常在 GitHub 存储库、调试器或审查工具中阅读。 对于使用此新功能的开发人员,建议考虑未来读者和维护人员的可读性。

J**a 新的高频发布节奏是一个可喜的变化。 它要求在发布日期之前发布准备好的功能,从而允许在下一个版本之前发布延迟功能的周转时间很短。 新的周期加速了 J**a 的进度,开发人员不必等待数年才能获得已经开发和搁置的功能。 有理由担心支持从一个主要版本到下一个主要版本的更短周期,但 LTS 应该有助于缓解这个问题。 另一个风险是版本疲劳,因为开发人员厌倦了不断迁移。 也就是说,总的来说,我认为这是一个积极的举动,将帮助 J**a 在未来一段时间内保持活力和成长。

相似文章

    Java 10 中的新增功能

    快速了解 J A 中的更改。J a 是当今使用最广泛的编程语言之一,于 年 月 日发布了第十个主要版本。为了更快迭代,更好地跟进社区反馈,j a 语言版本的发布周期已调整为每 个月发布一次。J A 是此新规则之后新发布周期的第一个主要版本。J a 带来了许多新功能,其中一项在局部变量类型的推理中最受...

    什么是专业化、精细化和创新?什么是专项、专项和新补贴?在一篇文章中理解它

    近年来,中国高度重视中小企业的发展。工业和信息化部发布 优质中小企业梯度培育管理暂行办法 对 专精特新中小企业认定标准 和 专精特新 小巨人 认定标准 进行了详细说明。一 专业化 精细化 创新的意义 指在特定方面具有独特专业知识和经验,以及对新兴事物和趋势有敏锐感知和洞察力的领域或技能。这句话强调个...

    专注新赛道、专精特新、新型“小巨人”企业!

    今天我们就来聊聊制造业 信息技术 机器人等领域正在兴起的小巨人企业!原则上,这些企业的主导产品都属于重点领域,这让人感叹 科技的力量是无穷无尽的!一 专精特新 小巨人 企业指的是什么类型的企业?专精特新小巨人是指在成长期业绩 发展潜力和培育价值较好,通过培育促进其健康成长,最终成为行业或区域内的 巨...

    22020F 10 风冷充电模块特点和优势:

    F 风冷充电模块是一种高效可靠的充电解决方案,广泛应用于电池充电 动力系统和电动汽车。其独特的设计和卓越的性能使其在市场上脱颖而出。本文将详细介绍F 风冷充电模块的特点和优势。.特点。高效充电 F 风冷充电模块采用先进的充电技术,提供高效的充电效率,可大大减少充电时间,提高充电速度。风冷设计 模块采...

    雅马哈 2024 MT 10 全新深灰色配色!

    雅马哈推出了 MT 和 MT SP 街头自行车,为 MT 采用新的深灰色配色,配备充满活力的蓝绿色车轮。SP版没有公布新的汽车颜色。预计将于 年 月 日开始销售,将在日本的 YSP 和 Advance 经销商处发售。自年开始销售的MT ABS是MT系列中排量最大的车型,排量从cc到大排量不等。它采用...