初探JAVA 10之var

当我们看到var的时候,首先想到的会是javascript。如果我像下面这样写,会不会觉得有编译错误?

var users = new ArrayList<User>();

JAVA 10引入了var,这种写法已经合法。那为什么JAVA要引入var呢?这种写法到底好不好?我们探讨下。

一般我们在定义一个变量的时候,会在左右两边都写一遍类型,比如:

URL url = new URL("www.baidu.com");

接下来会是这种代码:

URL baidu = new URL("http://www.baidu.com");

URLConnection connection = baidu.openConnection();

Reader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));

我们定义这些只使用一次的中间变量/临时变量,还得把它的类型完整写出来,会不会觉得有点多余?可不可以省略这一步,让编译器来帮我们做?可以的。从JAVA 10开始,编译器可以推导这些类型,只要你使用var关键字。

var baidu = new URL("http://www.baidu.com");

var connection = baidu.openConnection();

var reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));

想想编译器会怎么做?很简单。对比上面的两个代码块,区别就在于一个有类型,一个只有var。编译器会根据等号右边的类型推导出左边的类型,替换掉var,并且写入字节码。实际上,最后上面两个代码块的字节码是一样的。

这样带给我们什么样的便利呢?首先肯定是少打了几个字母。其次,阅读起来很简洁。当然也有不好的地方:没法直观知道变量的类型。当然,你说不是还有IDE可以帮我们么?那我们做code review的时候呢?

另外,你可能会想,是不是JAVA 10之后方法名或者变量都不能定义成var了?不会的。var在JAVA 10中并不是一个关键字,而只是一个保留的通用类型名。什么意思呢?只要你不把类名定义成var,其他场景你随便用。

对于前后端都精通的人,代入感不要太强。这写的不是js,js的神奇在JAVA语言里是不存在的,比如下面这幅图。


javascript

好了,上面说的都懂了吧?懂了的话,我们来想想下面几个问题:

1. 什么时候可以用var?什么时候不能用?

大家先看看JEP286。如果觉得看的麻烦,我解释一下:定义一个有初始值的局部变量时就可以用。像下面这种写法就是不行的:

var foo;

foo = "foo";

即便它是等价于var foo = "foo"也是不行的。下面这些写法也是不行的,包括lamda表达式方法引用:

var ints = {0, 1, 2}; //要使用new int[] {0, 1, 2}

var appendSpace = a -> a + " ";

var compareString = String::compareTo;

private var getFoo() {    

    return "foo";

}

写成下面这样是可以的:

var numbers = List.of("a", "b", "c");

for (var nr : numbers)    //for遍历时使用var声明变量

   System.out.print(nr + " ");

for (var i = 0; i < numbers.size(); i++)    //for遍历时使用var代表索引

    System.out.print(numbers.get(i) + " ");

另外,var也可以用于编程结构的改变。想象一下下面这种场景:

(new Object(){

    void foo(){

        System.out.println("I am in foo");

    }

}).foo();

定义了一个匿名对象,有一个方法叫foo。以前如果我们用Object接住这个类,那foo没有办法调用,因为它不是Object的方法。如果我们用var还可以这样写:

var obj = new Object(){

    public void foo(){

        System.out.println("I am in foo");

    }

};

......

obj.foo();

这里定义的匿名对象,编译器推断它有一个foo方法,使用var保留推断的类型信息,在后面调用foo方法都是没问题的。

所以,在以下场景使用var是完全没有问题的:

a. 局部变量。

b. for循环声明变量。

c. for循环索引变量。

2. 为什么成员变量和方法不能使用var?

这里的方法包括构造方法和一般性的方法。方法的参数和返回值都是不能使用var的。

成员变量和方法相对于局部变量来说,作用范围更大,使用var更容易出错,比如在方法中修改var变量的类型导致运行时异常。还有,对于使用var的地方,编译器都必须能够准确推断出类型信息,而成员变量和方法都是很难推断的。

3. 以后是不是本地变量都要用var呢?

未必。使用var确实能给我们带来便利,但是随之而来的是代码可读性变差。如果太多的var,看代码的人可能会很困惑,花不少时间在看类型上面。所以使用要适度,毕竟代码要给人看的,要是只有你一个人,那当我没说。Oracle JAVA架构师Brian Goetz这样说:

Use the var construct when it makes the code clearer and more concise and you’re not loosing essential information.

他的意思其实就是我们要把握好尺度,既要保证代码清爽精练,还要不能丢掉必要的信息。

好了,本次介绍var就到这里。如有介绍不清的地方,尽管拍砖。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,172评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,346评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,788评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,299评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,409评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,467评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,476评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,262评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,699评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,994评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,167评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,827评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,499评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,149评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,387评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,028评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,055评论 2 352

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,644评论 18 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,608评论 18 399
  • 《ijs》速成开发手册3.0 官方用户交流:iApp开发交流(1) 239547050iApp开发交流(2) 10...
    叶染柒丶阅读 5,106评论 0 7
  • 太忙会找不到自己,我们需要一些休息的时间,来找回自己。 这两天做了两个梦,一个是复杂的梦魇,一个是简单...
    雨季和海风阅读 188评论 0 2
  • 我捧着一个普普通通的玻璃瓶,大大的就像每天捧着的日子盛着大半瓶的期待 把它放在餐桌插上一种又一种的花朵生活,不动声...
    鼠想说的阅读 236评论 2 10