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

go语言var 和make_Var和语言设计相关推荐

  1. R语言VaR市场风险计算方法与回测、用LOGIT逻辑回归、PROBIT模型信用风险与分类模型...

    全文链接:http://tecdat.cn/?p=27530  市场风险指的是由金融市场中资产的价格下跌或价格波动增加所导致的可能损失. 相关视频 市场风险包含两种类型:相对风险和绝对风险.绝对风险关 ...

  2. 转:PL/0语言词法及语法分析系统的设计与实现

    PL/0语言词法及语法分析系统的设计与实现 作者:陶善文 南京航空航天大学信息与计算机科学专业 下载源代码 摘要:本文介绍了一个PL/0语言的词法及语法分析系统的设计与实现 关键词:循环分支 递归下降 ...

  3. Atitit. 脚本语言的断点单步调试的设计与实现 attialx 总结 php 参照java

    Atitit. 脚本语言的断点单步调试的设计与实现 attialx 总结 php 参照java 1. 断点的实现:手动断点 die和exit是等价的 1 2. 变量表的实现 1 3. print_r( ...

  4. 如何设计一门语言(十一)——删减语言的功能

    大家看到这个标题肯定会欢呼雀跃了,以为功能少的语言就容易学.其实完全不是这样的.功能少的语言如果还适用范围广,那所有的概念必定是正交的,最后就会变得跟数学一样.数学的概念很正交吧,正交的东西都特别抽象 ...

  5. c语言中英文翻译 毕业设计,c语言中英文翻译资料 本科毕业论文设计.doc

    c语言中英文翻译资料 本科毕业论文设计 The C Programming Language C is a high-level programming language developed by D ...

  6. c语言程序设计第2章,C语言程序设计第2章 结构化程序设计与算法.ppt

    C语言程序设计第2章 结构化程序设计与算法.ppt 现在人们公认的具有"良好风格"的程序设计方法之一是所谓的"结构化程序设计方法".其核心是规定了算法的三种基本 ...

  7. c语言上机指导答案清华,第一章自测练习答案清华大学c语言习题实验指导及课程设计...

    第一章自测练习答案清华大学c语言习题实验指导及课程设计 第一章 自测练习参考答案 一.简答题 1.源程序是程序员创建的,目标程序是编译器创建的,可执行程序是连接器创建的. 2.步骤如下:1)说明程序需 ...

  8. 文件的记录c语言程序,c语言程序学生籍贯信息记录簿设计.docx

    c 语言程序学生籍贯信息记录簿设计 学生籍贯信息记录簿 课程设计报告书 班 级: 方 0909-1 学 号:姓 名: 苑 小 叶 指导教师 : 康 亚 男 石家庄铁道大学四方学院 2010年 07月 ...

  9. c语言系统的通用数据结构,(转载)C语言实现通用数据结构的高效设计

    (转载)C语言实现通用数据结构的高效设计 [复制链接] 使用宏替代模板的方案 最近在阅读一个开源的C++代码,里面用到了大量的STL里面的东西.也许是自己一直用C而很少用C++来实现算法的原因,STL ...

最新文章

  1. android studio 的AVD Manager点击无响应解决办法
  2. WebView与JavaScript交互
  3. 关于linux LVM的好图 (Logic Volume Management,逻辑卷管理)
  4. qml-创建可移动的模态弹出框
  5. 微信小程序实现数字为四位一组间隔(仿银行卡卡号)
  6. Java中Web程序修改配置文件不重启服务器的方法
  7. 开始把一些东西放到博客上
  8. html 块级注释,HTML blockquote 标签 | 教程 | codingbefore
  9. 简单记录一次ORA-00600 kcratr_nab_less_than_odr
  10. 仿今日头条项目——个人中心
  11. 计算机协会取消信息学奥赛,教育部2019年公示:信息学奥赛正式取消?
  12. html5 省份热点图,javascript html5 canvas实现可拖动省份的中国地图
  13. 通过 Dockerfile 搭建标注工具 brat 的镜像
  14. 【加水印】如何批量加文字水印和图片水印,如何批量添加文件名水印到图片里?图片的名称批量写到图片上面?
  15. winForm在多显示器(主显示器 + 扩展显示器)上显示最大化和还原操作。
  16. 百度通用翻译api使用
  17. 学生报名管理系统的设计与实现
  18. Python中编码问题:u‘\xe6\x97\xa0\xe5\x90\x8d‘ 类型和 ‘\u559c\u6b22\u4e00\u4e2a\u4eba ’ 转为utf-8的解决办法
  19. 智能镜柜原来这么好用,真后悔我家装晚了
  20. ROS2与C++入门教程-创建服务(srv)文件 - 创客智造

热门文章

  1. 牛客题霸 [字符串的排列] C++题解/答案
  2. 牛客题霸 [ 求二叉树的层序遍历] C++题解/答案
  3. 牛客网【每日一题】4月14日题目精讲 Xorto
  4. AtCoder4515 [AGC030F] Permutation and Minimum(dp)
  5. YbtOJ#593-木棍问题【费用流】
  6. YbtOJ#20073-[NOIP2020模拟赛B组Day6]钻石守卫【构造】
  7. Java8-本地缓存
  8. Maven精选系列--eclipse各种操作
  9. Spring入门(四)之BeanFactory
  10. sh(Spring+Spring mvc+hibernate)——BaseDao.java