琥珀项目:Java的未来揭晓

如果一切按计划进行(我们正在研究Jigsaw项目),那么Java 9将在不到100天的时间内启动。 您可以在此处加入倒计时以发布它。 它将包含一长串新功能和升级功能,其中一些我们迫不及待想要看到实际应用。

但是,有些功能还没有为Java 9做好准备,这就是Project Amber出现的地方,因此这些功能可以成为现实。 这是什么意思? 让我们找出答案。

专注于Var / Val,Enums和Lambda

Java语言架构师Brian Goetz于去年1月首次提出了Amber项目,当时他提出创建一个项目来探索和孵化较小的,面向生产力的Java语言功能。

成为该项目一部分的功能的主要前提条件:已被接受为候选JEP,也称为JDK增强建议。 在此过程中,Oracle收集了有关Java开发工具包和OpenJDK增强功能的建议。 批准的提案将继续成为Java的实际功能。

Goetz指出,这个项目不是思考或讨论改进Java的新想法和随意想法的地方,并且“整个Internet仍然可以使用”。

3月16日,Goetz 欢迎Amber项目进入Java社区,并通过了前三个Java增强提案:

局部变量类型推断(JEP 286) –使用初始化程序将类型推断扩展到局部变量的声明
增强枚举(JEP 301) –使枚举更好的功能
Lambda剩菜(JEP 302) –改善lambda的可用性

为什么这三个项目受到如此特别的关注? 让我们找出答案。

满足琥珀项目的新功能

局部变量类型推断

大多数开发人员对Java的主要问题之一是它太冗长。 虽然在阅读并尝试理解编写函数时其他开发人员的想法时这可能是一件好事,但在实际编写这些函数时可能会很乏味。

此功能建议向Java添加一些语法糖以简化它。 这将允许声明变量而不必指定关联的类型。 例如,这:

List<String> list = new ArrayList<String>();
final Stream<String> stream = getStream();

将被替换为:

var list = new ArrayList<String>();
val stream = getStream();

如果您想了解有关此功能的更多信息,以及社区对此有何看法,请查看我们的Java新本地变量类型推断语言功能动手概述 。

增强枚举

此功能的目标是增强Java语言中的枚举构造的表达能力。 如提案中所述,Java枚举是功能强大且常用的构造。 它们允许对常数进行分组,其中每个常数都是一个单例对象。 当变量必须等于为其预定义的值之一时,它将使变量成为一组预定义的常数。 例如,星期几。

增强功能将允许枚举类型变量(泛型支持),从而可以扩展枚举。 它还将对枚举常量执行更清晰的类型检查,以验证和强制执行枚举约束。

具有泛型支持的枚举将使我们能够指示键集及其关联的类型,并且我们能够向单个项目添加方法。 这两个功能将协同工作,以使枚举常量能够承载特定于常量的类型信息以及特定于常量的状态和行为。 增强的枚举将使我们能够使用通用类型定义枚举。 当表示数学常数时,可以显示此功能某些值的示例:

public enum MathematicalConstants < T > {E < Double > (Math.PI),PI < Double > (Math.E),ZERO < Integer > (0),ONE < Integer > (1),i < Complex > (new Complex(0, 1))private MathematicalConstants(T underlyingObject) {this.underlyingObject = underlyingObject;}
}

在此示例中,我们可以添加对其他方法的支持,同时仍然享受每种方法的类型安全性。 当底层对象不必是对象类型时,可以将不同类型传递给枚举的构造函数,这展示了此功能可以带来的优雅。

增强枚举的另一个有用应用是减少在不同数据类型之间转换的样板代码。 例如,jdbc类型转换为Java类型。 它可以帮助提高我们的代码自我记录的能力,并避免像“ instanceOf”检查那样的代码气味。

Lambda剩菜剩饭

Project Lambda于2014年随Java 8一起发布,但总有改进的余地。 这里的想法是通过增强方法上下文中函数表达式的歧义性来提高lambda表达式和方法引用的可用性。

此功能还着重于完成下划线字符的修复以指示未使用的lambda参数,并允许lambda参数对封闭范围中的阴影变量。

使用下划线作为未命名的lambda参数的符号的概念已经在其他语言中存在,其目标是也使其成为Java的一部分。 使用非常简单,看起来像这样:

BiFunction<Integer, String, String> biss = (i, _) -> String.valueOf(i);

它为什么如此重要? 因为这将允许对未使用的参数进行更强的静态检查,并且还允许将多个参数标记为未使用。 但是,执行该选项可能很困难,因为下划线已经是有效的标识符,并且需要进行一些调整和兼容性才能使其起作用。

Java的附带项目

Project Amber加入了诸如Valhalla之类的Java长期项目,以处理不可变且无引用的对象, Shenandoah旨在减少GC暂停时间和XRender Graphics Pipeline ,以创建新的Java2D图形管道为目标。 。

Lambda和Jigsaw是其中两个比较受人关注的项目。 Lambda项目是Java 8的一部分,于2014年3月引入,它将Lambda表达式和流引入Java。 Jigsaw项目即将成为Java 9的一部分,旨在使Java模块化并将JRE分解为可互操作的组件。

这两个项目都花费了大量的精力-Lambda于2009年12月首次引入,花了5年多的时间才成为Java的实际组成部分。 拼图是在2008年12月推出的,随后进行了将近9年半的工作。

这不一定意味着项目Amber将具有相同的时间表,但这很好地表明了将主要功能集成到Java中需要花费多长时间。 但是,在此项目的公告中充满了希望。

除了通常获得的邮件列表项目外,Goetz还发布了正式的回购协议。 与类似的项目不同,由于团队将处理多个JEP,因此将在分支中完成工作,而默认的JEP将同步到jdk10。 这是否意味着Amber可能会成为下一个Java版本的一部分? 我们将不得不拭目以待。

为什么是琥珀色?

如果您想知道名称及其名称,Java开发人员兼SitePoint Java部分的编辑Nicolai Parlog将这个问题发给了Brian Goetz本人。 他得到了一个简单的回答:“为什么不呢?”。

但是,Goetz建议举行比赛以提出候选人。 他亲自挑选了获胜者,并提供了以下解释:

而且您必须承认这听起来很酷。

最后的想法

Java是一种具有许多功能,能力和程序员的大型语言。 Project Amber加入了已经在进行中的功能列表,所有这些功能都具有相同的目标-帮助开发阶段更快地进行,并满足Java工程师和开发人员的需求。

现在有两个主要问题– Project Amber将采用哪些其他建议,以及将它们变成Java现实需要多长时间。

翻译自: https://www.javacodegeeks.com/2017/05/project-amber-future-java-exposed.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/350797.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安装saltstack

https://www.cnblogs.com/agnewee/p/6487262.html 官方资料&#xff1a;https://docs.saltstack.com/en/latest/ref/configuration/index.html 官网资料&#xff1a;https://repo.saltstack.com/#rhel yum install https://repo.saltstack.com/py3/redhat/salt-py3-repo-latest…

python中for和while区别_Python学习第九篇——while和for的区别

1 pets [dog,cat,dog,goldfish,cat,rabbit,cat]2 print(pets)3 for pet inpets:4 print(pet)5 #------------------------------------------ 6 pets [dog,cat,dog,goldfish,cat,rabbit,cat]7 print(pets)8 while pet inpets:9 print(pet) 上述代码都想打印列表中的所有元素&…

java 11:数组作为函数参数,数组做为函数返回值

1 数组作为参数 我们可以将数组作为参数&#xff0c;传入到函数中&#xff0c;其实就像我们main函数中 public void main(String [] args){};就是用数组作为函数参数&#xff1b; 又如&#xff0c; [java] view plaincopypublic class ArrayPar { public static void p…

C++ 指针基本概念

Ⅰ.内存和地址 我们已经很熟悉一些基本的存储单位了,比如一个bit(位)用存储0或者1.也可以把几个bit合起来表示更大的数字,比如一个byte(字节)就包含了8个bit.这些都是很基础很简单的东西.然后我们可以把计算机的内存想象成一个字节数组,内存中的每一个地址表示一个字节. 每个字…

Java 7:使用NIO.2进行文件过滤–第2部分

大家好。 这是使用NIO.2系列进行文件过滤的第2部分。 对于那些尚未阅读第1部分的人 &#xff0c;这里有个回顾。 NIO.2是自Java 7起JDK中包含的用于I / O操作的新API。使用此新API&#xff0c;您可以执行与java.io相同的操作&#xff0c;以及许多出色的功能&#xff0c;例如&a…

机器人教育发展_得于人工智能发展,机器人教育低龄化越来越普及

近两年&#xff0c;各种看得到看不到的渠道都在推荐学机器人少儿编程&#xff0c;虽有利益使然&#xff0c;不过机器人少儿编程也确实算得上是通往世界名校大门的快速通道。相信很多家长也同样能感到&#xff0c;最近这股风刮得实在是太大&#xff0c;以至于周围的家长们都开始…

C#相对路径

1、 根目录 .\\ 或者直接给出文件名称&#xff0c;是找根目录的路径。 如&#xff1a;path "gs.mdb" 与 path ".\\gs.mdb"是一个意思。 2、 根目录的上级目录, 在C#中是指定到bin文件夹里面 ..\\ 应用程序的根目录的上两级 3、指定到根目录上面的三级目录…

java finalize方法的使用

《JAVA编程思想》&#xff1a; Java提供finalize()方法&#xff0c;垃圾回收器准备释放内存的时候&#xff0c;会先调用finalize()。 (1).对象不一定会被回收。 (2).垃圾回收不是析构函数。 (3).垃圾回收只与内存有关。 (4).垃圾回收和finalize()都是靠不住的&#xff0c;只要…

C++ 运算符优先级

优先级运算符名称或含义使用形式结合方向说明1[]数组下标数组名[常量表达式]左到右 ()圆括号&#xff08;表达式&#xff09;/函数名(形参表) .成员选择&#xff08;对象&#xff09;对象.成员名 ->成员选择&#xff08;指针&#xff09;对象指针->成员名 2-负号运算符-表…

另一个拼图观点

在过去的几周中&#xff0c;围绕即将发布的Java 9及其最著名的功能&#xff1a;Java平台模块系统JPMS展开了激烈的辩论。 –以项目拼图Jigsaw的名称而闻名。 模块系统以正式规范过程的形式引入Java生态系统 – JSR –需要由专家组以最终形式批准。 在该专家组的其他成员中&am…

Cookie中不能有空格_前端小贴士 -- 全面了解Cookie

一、Cookie的出现浏览器和服务器之间的通信少不了HTTP协议&#xff0c;但是因为HTTP协议是无状态的&#xff0c;所以服务器并不知道上一次浏览器做了什么样的操作&#xff0c;这样严重阻碍了交互式Web应用程序的实现。针对上述的问题&#xff0c;网景公司的程序员创造了Cookie。…

线程面试题

1.在使用线程时&#xff0c;为什么不直接调用run()方法而是调用了start(): 直接调用run()方法&#xff0c;不存在线程的启动&#xff0c;属于调用实例方法&#xff0c;只有一条执行路径&#xff0c;不存在多线程并行交替执行了。调用start()方法属于启动线程&#xff0c;将自动…

Java IO - Reader

前言 JavaIO一共包括两种&#xff0c;一种是stream&#xff0c;一种是reader/writer&#xff0c;每种又包括in/out&#xff0c;所以一共是四种包。Java 流在处理上分为字符流和字节流。字符流处理的单元为 2 个字节的 Unicode 字符&#xff0c;分别操作字符、字符数组或字符串&…

python程序设计语言的执行方式_编程语言用Python执行程序的4种方式

在编写代码中&#xff0c;经常会遇到在 Python程序中打开外部程序的需求&#xff0c;那么在Python里如何打开外部程序呢?今天我们来介绍四种不同的方式&#xff0c;供大家参考收藏。 使用 os.system() os.system(command)是最简单的一种方式&#xff0c;我们import os模块&…

leetcode 994.腐烂的橘子

题目&#xff1a; 在给定的网格中&#xff0c;每个单元格可以有以下三个值之一&#xff1a; 值 0 代表空单元格&#xff1b;值 1 代表新鲜橘子&#xff1b;值 2 代表腐烂的橘子。每分钟&#xff0c;任何与腐烂的橘子&#xff08;在 4 个正方向上&#xff09;相邻的新鲜橘子都会…

运行时异常和检查性异常区别

Java提供了两类主要的异常:runtime exception和checked exception。checked 异常也就是我们经常遇到的IO异常&#xff0c;以及SQL异常都是这种异常。对于这种异常&#xff0c;JAVA编译器强制要求我们必需对出现的这些异常进行catch。所以&#xff0c;面对这种异常不管我们是否愿…

VS2015配置freegult

与vs配置opencv类似 1.首先先找到自己系统里OpenGL相关.h.lib .dll的位置 一般系统里已自带&#xff0c;只要去找到就好&#xff0c;我的位置&#xff1a; gl.h C:\Program Files\Microsoft SDKs\Windows\v6.0A\Include\gl OpenGL32.Lib GlU32.Lib C:\Program Files\Microsoft…

java 死锁的检测与修复_调查死锁–第4部分:修复代码

java 死锁的检测与修复在这个简短的博客系列的最后BadTransferOperation中&#xff0c;我一直在讨论分析死锁&#xff0c;我将修复BadTransferOperation代码。 如果您已经看过本系列的其他博客 &#xff0c;那么您会知道&#xff0c;为了达到这一点&#xff0c;我创建了死锁演示…

python下载url_三种Python下载url并保存文件的代码详解

利用程序自己编写下载文件挺有意思的。 Python中最流行的方法就是通过Http利用urllib或者urllib2模块。 当然你也可以利用ftplib从ftp站点下载文件。此外Python还提供了另外一种方法requests。 来看看三种方法是如何来下载zip文件的&#xff1a; import urllib import urllib2 …

springcloud(七)-Feign声明式REST调用

前言 前面我们使用的RestTemplate实现REST API调用&#xff0c;代码大致如下&#xff1a; public User findById(PathVariable Long id) {return restTemplate.getForObject("http://localhost:8084/" id, User.class);} 由代码可知&#xff0c;我们是使用拼接字符串…