jdk10 var定义变量的由来
题图:by jordhammond from instagram
本文选自聊聊架构公众号,略有修改
以前我们 Java 程序员经常会对其他语言中的 var 关键字耿耿于怀,如今,Java 10 也要启用 var 进行变量声明了……
早在 2016 年,有一个 JDK 增强提议(JEP)在 Java 社区引起了轰动:JEP 286。2 年后的今天,局部变量类型推断可以说是 Java 10 中最值得关注的特性。这是 Java 语言开发者为简化 Java 应用程序的开发而采取的又一举措。接下来我将为大家介绍这一举措的意义和对 Java 程序员的影响。
分解局部变量类型推断
这个新特性将为 Java 增加一些语法糖——简化它并改善开发者体验。新的语法让 Java 代码更简洁,同时保持静态类型安全。
换句话说,你将能够声明变量而不必指定关联的类型。比如之前如下的变量声明:
List<String> list = new ArrayList<String>();Stream stream = getStream();
简化后的语法如下:
var list = new ArrayList();var stream = getStream();
如上所示,局部变量类型推断将引入“var”关键字,而不要求明确指定变量的类型。
大家都知道,Java 的语法有点冗长,这对于理解开发人员编写函数的意图可能会有好处。但是,对于那些认为用 Java 开发软件太乏味的人来说,这个特性意味着一个重大的改变。
虽然类型推断在 Java 中不是一个新概念,但对于局部变量来说却是全新的。
这一切都是在 Java 5 中引入泛型时开始的。然后,Java 7 作为 Coin 项目的一部分进一步开发出了菱形运算符(<>),该运算符允许使用没有绑定类型的 ArrayList<>初始化列表,而 Java 8 中出现了 Lambda 表达式。使用菱形操作符可以编写以下代码:
List list = new LinkedList<>();
现在,Oracle 团队要更进一步。
社区反应
在 JEP 286 成为事实上的 JEP 之前,Oracle 进行了一项调查,以更好地了解 Java 社区对该提议的反应。调查大部分集中在对提议的总体感受上,以及社区对实现这个特性有哪些想法。在 2453 名开发人员的回复中,大部分是赞成的:
调查问题:你对局部变量类型推断提议的总体感受是怎样的?
调查的第二部分侧重于可能的语法选择,基于其他语言(如 C#、Scala、Swift 和 C ++)中的类似用法提出了 5 个选项,或使用 let。
大多数用户投票选择 var 和 val:
调查问题:可能的语法选项
最后,团队决定选用第二受欢迎的选项,也就是使用 var。
Java 社区的大多数成员似乎都赞同这种新的选择,其中许多人要求 Oracle“与时俱进”。少数反对该特性的开发人员声称,对于那些新学 Java 的人来说可能会很困难,也有人指出现有的语法是“冗长和易读性的最佳组合”。
当然,在 JEP 286 主页上,可以看到添加新功能的理由:
Java 几乎是唯一不包含局部变量类型推断的静态类型语言;因此,这个功能不应该再有争议。
对编码有何影响?
在兴奋过后,我们通常想问自己的第一个问题是:这对我的代码有何影响?在特性总结中,处理“Java 中样板编码的度”是主要动机,因此我们可以期待将来能够省略掉类型声明。
更具体的,它局限于:
有初始化值的局部变量
增强 for 循环中的索引
传统 for 循环中声明的局部变量
Oracle 的 Java 团队申明,以下不支持局部变量类型推断:
方法参数
构造函数参数
方法返回类型
字段
catch 代码块(或任何其他类型的变量声明)
由于 Java 承诺支持以前版本,我们可以认为它不会破坏向后兼容性。
其他改进:GC 改进和其他内务特性
JDK 10 中有 2 个 JEP 专注于改进当前的 GC。第一个 JEP,垃圾回收接口(JEP 304),将引入一个干净的垃圾回收接口,以提升不同垃圾回收器的源代码隔离。
在当前的 Java 版本中,GC 源文件零散地分散在 HotSpot 源代码中。这在实现新的垃圾回收器时会成为问题,因为开发人员必须知道在哪里查找这些源文件。此 JEP 的主要目标之一是,使 HotSpot 内部 GC 代码更加模块化,GC 接口更干净并使实现新回收器更加容易。
Java 10 的第二个 JEP 是针对 G1 的 Parallel Full GC(JEP 307),其重点在于通过 Parallel Full GC 来改善 G1 最坏情况的等待时间。G1 是 Java 9 中的默认 GC,此 JEP 的目标是使 G1 也支持并行收集。
Java 10 计划的特性还有:
ThreadLocal Handshake(JEP 312)。这将引入一种在线程上执行回调的新方法,让关闭单个线程成为可能,而不是关闭所有线程或一个都不关闭。
备用内存设备堆分配(JEP 316)。使 HotSpot 虚拟机能够在用户指定的备用内存设备上分配对象堆内存。
额外的 Unicode 语言标记扩展(JEP 314)。目标是增强 java.util.Locale 及其相关的 API,以便实现语言标记语法的其他 Unicode 扩展(BCP 47)。
实验性的基于 Java 的 JIT 编译器(JEP 317)。Oracle 希望将其 Java JIT 编译器 Graal 用作 Linux / x64 平台上的实验性 JIT 编译器。
根证书(JEP 319)。目的是开源 Oracle Java SE 的根证书。
根证书颁发机构(CA),提升 OpenJDK 版本对开发人员的吸引力,也想缩小 OpenJDK 和 Oracle JDK 之间的差距。
将 JDK 的多个代码仓库合并到一个代码仓库中(JEP 296)。这个 JEP 的主要目标是做一些内务工作,将众多 JDK 仓库合并到一个仓库中。
去掉 javah 工具(JEP 313)。
上手体验
就像所有其他 JDK 版本一样,Oracle 已经创建了一个 Early Access Release,Java 用户可以下载下来试用新功能。事实上,这个 JEP 自 2016 年初开始就已经可用于体验目的,那你还等什么?
http://jdk.java.net/10/
即使你还没有开始考虑迁移到 JDK 9,感受新功能并有机会向平台设计人员提供反馈,这是学习新版本并在社区产生一定影响的好办法。
jdk10 var定义变量的由来的更多相关文章
- es6的let与es5的var定义变量的区别
es6的let与es5的var定义变量的区别 自身新手第一次接触let关键字的时候,不知道let与var的区别,本能认为是一样,但非如此,比如下述的代码运行就会报错: let hello = 'hel ...
- C#使用var定义变量时的四个特点
使用var定义变量时有以下四个特点: 1. 必须在定义时初始化.也就是必须是var s = “abcd”形式: 2. 一但初始化完成,就不能再给变量赋与初始化值类型不同的值了. 3. var要求是 ...
- var定义变量的使用细节
js中定义一个变量可以加关键词var也可以不加,规则是这样的: 1. 在全局范围内用不用var都可以,变量都是全局的 2. 在局部范围内比如函数中,用不用var是不一样的,用v ...
- let 和 var 定义变量的区别
一.变量提升 var 存在变量提升,而 let 不存在变量提升,所以用 let 定义的变量一定要在声明后再使用,否则会报错. var //var定义的变量存在变量提升,变量会把声明提升到整个作用域的最 ...
- 数据可视化之DAX篇(八) DAX学习:使用VAR定义变量
https://zhuanlan.zhihu.com/p/64414205 前面介绍如何使用DAX生成日期表的时候,使用了VAR,有人留言问这个VAR怎么理解,那么这篇文章就来介绍VAR以及它的用法. ...
- 【转载】浅谈JavaScript,let和var定义变量的区别
了解JS与ES5与ES6区别 JS语言 JavaScript一种动态类型.弱类型.基于原型的客户端脚本语言,用来给HTML网页增加动态功能. 动态: 在运行时确定数据类型.变量使用之前不需要类型声明, ...
- ts和js中let和var定义变量的区别
javascript 严格模式 第一次接触let关键字,有一个要非常非常要注意的概念就是”JavaScript 严格模式”,比如下述的代码运行就会报错: let hello = 'hello worl ...
- js中let和var定义变量的区别
let变量之前没见过,刚遇到,探探究竟. 以下转自:http://blog.csdn.net/nfer_zhuang/article/details/48781671 声明后未赋值,表现相同 (fun ...
- 不使用var定义变量和使用var的区别
最基本的var关键字是上下文的,而不采用var是全局的这就不讨论了 “不管是使用var关键字(在全局上下文)还是不使用var关键字(在任何地方),都可以声明一个变量”.这貌似一个错误的概念:任何时候, ...
随机推荐
- 集合之Stack
在Java中Stack类表示后进先出(LIFO)的对象堆栈.栈是一种非常常见的数据结构,它采用典型的先进后出的操作方式完成的.每一个栈都包含一个栈顶,每次出栈是将栈顶的数据取出,如下: Stack通过 ...
- Python基础-画图:matplotlib
Python画图主要用到matplotlib这个库.具体来说是pylab和pyplot这两个子库.这两个库可以满足基本的画图需求. pylab神器:pylab.rcParams.update(para ...
- nmap 扫描端口 + iftop 实时监控流量
sleep 1|telnet 127.0.0.1 223 nmap 127.0.0.1 -p 223 -PN (对禁ping IP) iftop -P -n -B -B 按字节显示 -N 切换 端 ...
- caffe 安装记录
为了使用caffe,特地装了linux系统,版本:Ubuntu14.04 X64 可参照 http://www.cnblogs.com/platero/p/3993877.html 这个博客写的更好h ...
- jQuery----淘宝商品展示(类似与tab切换)
实现效果如图: 功能需求: ①鼠标进入商品名称,商品名称变色,同时对应的物品展示图片显示对应的物品,鼠标移出时候,商品名称恢复原来的颜色 实现分析: 1.HTML+CS ...
- 记Macbook Pro配合FT232使用PN532模块
0x00实话. 被自己傻到 在linux下使用 libusb + libnfc 这两个库就可以配合串口直接使用pn532模块 当时配置文件是写在 /etc/nfc 目录下的 而我在OS X 下居然也想 ...
- php生成带自定义logo和带二维码跳转自定义地址的二维码
index.php<?phpheader('Content-type:text/html;charset=UTF-8');// 指定允许其他域名访问header('Access-Control- ...
- C语言学习记录_2019.02.05
switch只能判断整数,而分段函数的判别是一个范围,我们无法用整数来表示范围 跟踪语句的方法: (1)debug调试 (2)printf( )语句跟踪 小套路:当循环次数很大时,可以先模拟较小次数的 ...
- mysql远程连接权限设置
今儿有位同事提出,一套MySQL 5.6的环境,从数据库服务器本地登录,一切正常,可是若从远程服务器访问,就会报错, ERROR 1045 (28000): Access denied for use ...
- GoLang 命令
目录 查看可用命令 build 和 run 命令 go build编译时的附加参数 clent命令 fmt 和 doc 命令 get 命令 远程包的路径格式 go get+远程包 go get使用时的 ...