go语言var 和make_Var和语言设计

go语言var 和make

Java中的var是什么

在Java 10中引入的var预定义类型使您可以在为变量分配值时声明局部变量,而无需指定变量的类型。 当给变量赋值时,表达式的类型已经定义了变量的类型,因此没有理由在行的左侧再次键入类型。 例如,当您具有一些带有泛型的复杂长类型时,这特别好

 HashMap<String,TreeMap<Integer,String> myMap = mapGenerator(); 

您可以在以前的Java版本中继承的泛型类型,但是现在您只需输入

 var myMap = mapGenerator(); 

这比以前的版本更简单,并且大多数时候可读性更高。 var的目的主要是可读性。 重要的是要了解,以这种方式声明的变量将具有类型,并且这种新的预定义类型(不是关键字)的引入不会使Java成为动态语言。 您可以通过某些方式做到这一点,这是您以前无法做到的,或者只能以更加冗长的方式做到。 例如,当您将匿名类的实例分配给变量时,可以通过var声明的变量调用该类中的声明方法。 例如:

 var m = new Object{ void z(){} }  mz(); 

您可以调用方法z()但代码

 Object m = new Object{ void z(){} }  mz(); 

不编译。 您可以这样做,因为匿名类实际上在其诞生时就有一个名称,因此当实例分配给声明为Object类型的变量时,它们只会丢失名称。

var关键字有一些阴暗的部分。 这样,我们违反了实例化具体类的通用规则,但是将变量声明为接口。 这是我们通常在Java中通常遵循的通用抽象规则。 当我创建一个返回HashMap的方法时,通常将返回值声明为Map 。 这是因为HashMap是返回值的实现,因此与调用者无关。 我在返回类型中声明的是,我返回实现Map接口的内容。 我的工作方式是我自己的责任。 同样,如果可能的话,我们通常将类中的字段声明为某种接口类型。 局部变量也应遵循相同的规则。 几次,当我声明要Set的局部变量但实际值是TreeSet然后键入代码时,对我很有帮助。 然后我意识到我正在使用某些不是Set而是SortedSet 。 它帮助我认识到在特殊情况下排序性很重要,这对于调用者也很重要,因此我不得不将方法的返回类型也更改为SortedSet 。 请注意,此示例中的SortedSet仍然是接口,而不是实现类。

通过使用var我们将失去它,并且获得了稍微简单一些的源代码。 一如既往,这是一个折衷。 在使用局部变量的情况下,就源代码而言,该变量的使用与声明很接近,因此开发人员可以一目了然地了解发生了什么以及发生了什么,因此,这种折衷的“坏”方面是可以接受的。 在方法返回值或字段的情况下,无法进行相同的折衷。 这些类成员的使用可以在不同的类,不同的模块中。 看到这些值的所有用法不仅很困难,而且也可能是不可能的,因此在这里,我们仍然沿用旧的方式:声明类型。

var的未来(只是想法)

在某些情况下,甚至不能将var用于局部变量。 很多时候,我们有以下编码模式:

 final var variable; // this does not work in Java 11  if ( some condition ) { 
     variable = expression_1 
     // do something here  } else { 
     variable = expression_2 
     // do something here  } 

这里我们不能使用var因为声明本身没有赋值给变量的表达式。 但是,编译器可以扩展。 从现在开始,我所谈论的不是Java。 这就是我想象的将来的版本。

如果结构简单,并且“在这里做某事”为空,则可以将结构转换为三元运算符:

 final var variable = some condition ? ( expression_1 ) : (expression_2) var variable = some condition ? ( expression_1 ) : (expression_2) 

在这种情况下,即使我们使用Java的旧版本,例如Java 11,也可以使用var声明。但是,请小心!

 var h = true ? 1L : ? 1L : 3.3 ; 

在此示例中,变量h的实际类型是什么? Number ? 三元运算符具有复杂且特殊的类型强制规则,由于两个表达式彼此靠近,通常不会引起任何问题。 如果我们让上述结构使用类似的类型强制,则表达式彼此之间的距离并不那么紧密。 到目前为止,Java的距离已经足够远,不允许使用var类型定义。 我个人的观点是,应在将来的某个时候扩展var声明,以允许使用上述结构,但仅在两个(或两个或更复杂的结构)表达式具有完全相同的类型的情况下才可以。 否则,我们可能最终得到一个表达式,该表达式导致一个int ,另一个表达式导致一个String ,那么变量的类型将是什么? 回答前请勿偷看图片!

(这个很好的例子是Nicolai Parlog给出的。)

我还可以想象,将来我们会拥有类似于Scala val东西,它是Java 11中的final var 。我不喜欢var vs. val命名。 这是极度性感和怪异的,但很容易将一个人误认为另一个人。 但是,如果我们有一个以final关键字开头的局部变量声明,那么为什么之后需要var关键字呢?

最后,我确实相信var是Java 11中的出色工具,但我也希望将来它的作用会得到扩展。

翻译自: https://www.javacodegeeks.com/2019/03/var-language-design.html

go语言var 和make

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值