var 是 Java 开发的好朋友啊!
简评:Java var != JavaScript var。
Java 10 中引入了新的语法用于局部变量类型推断,很多开发者有所疑惑,希望这篇文章能帮到你。
什么是类型推断
其实在 Java 中类型推断早就存在了,看下下面的例子:
public void doSomething() {
final List<String> names = new ArrayList<String>();
// ^^^^^^------- Redundant
...
}
在这个例子中给 ArrayList 定义持有的类型就没必要了,因为 List<String> 已经定义了我们需要的类型 String ,在 Java 7 中增加了类型推断,这时例子可以直接写成
public void doSomething() {
final List<String> names = new ArrayList<>();
// ^^------ Inferred!
...
}
这两种写法是完全合法的,而且最终会形成一样的字节码。对经常使用泛型的开发者来说,可能早就对上面的类型推断写法习以为常。
那什么是局部变量类型推断?
即能推断出方法中局部变量的类型,这是 Java 10 中新增的特性,对应关键词 var,看个例子 :
public void doSomething() {
final ??? name = "Todd";
}
name 是什么类型,很明显是 String,而 Java 10 就可以让编译器帮我们判断其类型,我们只要写成下面的形式:
public void doSomething() {
final var name = "Todd"; // name is inferred as a String!
}
var 的使用不局限于函数内声明的变量,同时也可以用于循环的索引:
final List<String> names = new ArrayList<>();
public void doSomething() {
for(var name: names) {
System.out.println("Name: " + name);
}
for(var i = 0; i < names.size(); i++) {
System.out.println("Name: " + names.get(i));
}
}
我必须使用 var 吗?不是的,老方法一样完美支持。
这样的做法危险吗?
一个字:不。
简单说它是受限于它们存在的方法(或循环声明)的范围。这意味着除了声明它们的方法的开发之外,人们不编写依赖于这些类型的代码。
还有大家会有一个疑惑,很多语言也是不需要定义类型的,完全由编译器搞定,以 JavaScript 举例:
var x = "Todd"
简单吧,x 是 String 类型的,但是在 JS 中能重新定义类型,比如:
var x = "Todd"
x = 42 // Now it's an int?!
像这种 Java 以后是不是也不用考虑变量类型了?错,和JS 不一样,Java 中的 var 只能在局部变量使用外,同时是不能重复赋值的,就拿上面的例子,会导致编译错误:
public void doSomething() {
var x = "Todd";
x = 42; // Compiler fails on this line:
// Error: java: incompatible types: int cannot be converted to java.lang.String
}
所以 var 一点都不危险,Java 也不会因此变成动态类型分配语言,这仅仅是对局部变量多了一种定义方式。
总结下
- Var 是我们的好朋友;
- Java var != JavaScript var;
- Var 解决了你显示声明变量的一些麻烦,但他们依然存在;
- Var 声明的变量和显示声明的变量是一模一样的;
- Var 类型变量不会影响到你其他的代码;
- 多了解一下总不会错吧!
原文链接: Java Developers: var Is Your Friend • Todd Ginsbergtodd.ginsberg.com
var 是 Java 开发的好朋友啊!的更多相关文章
- centos7之Java开发环境构建
CensOS7环境 我个人的博客环境如下: 希望这个教程可以帮助到linux新手朋友们或者其他在安装软件时遇到问题的朋友们 当然了,百度上也有很多类似这样的教程,我个人贴出来,一来为分享,二来以后自己 ...
- 为什么阿里巴巴Java开发手册中强制要求整型包装类对象值用 equals 方法比较?
在阅读<阿里巴巴Java开发手册>时,发现有一条关于整型包装类对象之间值比较的规约,具体内容如下: 这条建议非常值得大家关注, 而且该问题在 Java 面试中十分常见. 还需要思考以下几个 ...
- java开发_模仿百度文库_OpenOffice2PDF_注意事项
在模仿百度文库的操作过程中,有很多朋友反映出来的一些问题,是我想起了写这篇blog. 主要是让大家在做的过程中注意一些东西,否则达不到想要的效果. 第一步:我们先从 java开发_模仿百度文库_Ope ...
- 面向 Java 开发人员的 Ajax: 构建动态的 Java 应用程序
面向 Java 开发人员的 Ajax: 构建动态的 Java 应用程序 Ajax 为更好的 Web 应用程序铺平了道路 在 Web 应用程序开发中,页面重载循环是最大的一个使用障碍,对于 Java™ ...
- [翻译]现代java开发指南 第二部分
现代java开发指南 第二部分 第二部分:部署.监控 & 管理,性能分析和基准测试 第一部分,第二部分 =================== 欢迎来到现代 Java 开发指南第二部分.在第一 ...
- [翻译]现代java开发指南 第一部分
现代java开发指南 第一部分 第一部分:Java已不是你父亲那一代的样子 第一部分,第二部分 =================== 与历史上任何其他的语言相比,这里要排除c语言和cobol语言,现 ...
- 读阿里巴巴Java开发手册v1.2.0之编程规约有感【架构篇】
不为过去蹉跎,改变当下. 为什么开篇就送这么一句话给大家,我相信很多处于1-3年码龄的哥们儿们,在平时的编码历程中编码的个性可能是多彩的,每个人都有每个人特定的风格,但是我们现在这么随意写,以后这么 ...
- 读书笔记 之 《阿里巴巴Java开发手册》
一.前言 这本书主要定义了一些代码的规范以及一些注意事项.我只根据我自己的不足,摘录了一些内容,方便以后查阅. 二.读书笔记 命名 1.代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符 ...
- 阿里官方Java代码规范标准《阿里巴巴Java开发手册 终极版 v1.3.0》
终极版 v1.3.0 2017年开春之际,阿里诚意献上重磅大礼:<阿里巴巴Java开发手册>,首次公开阿里官方Java代码规范标准.这套Java统一规范标准将有助于提高行业编码规范化水平, ...
随机推荐
- react-navigation 3.x版本的安装以及react-native-gesture-handler配置
一.安装依赖,使用npm或yarn命令,3.x版本必须安装react-native-gesture-handler react-navigation react-native-gesture-hand ...
- LUA Metatables
__index:当我们访问一个表中的元素不存在时,则会触发去寻找__index元方法,如果不存在,则返回nil,如果存在,则返回结果. 博主注:__index有点像异常处理的意思 __newindex ...
- How to use mouse to moving windows of not have title bar?
How to use mouse to moving windows of not have title bar? #include "widget.h" #include < ...
- HttpClient详解
HttpClient:是一个接口 首先需要先创建一个DefaultHttpClient的实例 HttpClient httpClient=new DefaultHttpClient(); 发送GET请 ...
- 状态模式c#(状态流转例子吃饭)
using System;using System.Collections.Generic;using System.Linq;using System.Text; namespace 状态模式{ ...
- Mybatis之整体描述
Mybatis在我看来最大的用处就是封装了jdbc,设置参数操作和获取解析结果集.同时控制了数据库链接等操作,大部分采用了反射来映射javabean对象来进行数据库操作. 1.接下来先整体介绍下主要的 ...
- UVa 1395 Slim Span (最小生成树)
题意:给定n个结点的图,求最大边的权值减去最小边的权值最小的生成树. 析:这个和最小生成树差不多,从小到大枚举左端点,对于每一个左端点,再枚举右端点,不断更新最小值.挺简单的一个题. #include ...
- linux nkf 日文编码转换命令[转载]
对于日语的编码 windows : Shift-JIS Linux : 2.4内核使用EUC编码,2.6内核中使用UTF8编码 检查文件编码 nkf -g filename 通常处理字符编码都使用i ...
- Linux 基础教程 25-命令和文件查找
which 不管是在Windows还是Linux系统中,我们都会偶尔执行一些系统命令,比如Windows常见的cmd.ping.ipconfig等,它们的位置都在%systemdrive%中. ...
- oracle树形语句
oracle树查询的最重要的就是select…start with…connect by…prior语法了.依托于该语法,我们可以将一个表形结构的以树的顺序列出来.在下面列述了oracle中树型查询的 ...