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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/332580.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c语言每次堆的变化是1k,DSPXC语言+程序烧写讲述.ppt

DSPXC语言程序烧写讲述* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 第2.5节 DSP程序烧写 第2.5节 DSP程序烧写 第2.5节 DSP程序烧写 注意事项: 电路元件初始化同步问题&#xff1a;由于外…

众智日照分析软件_飞时达CAD日照分析计算软件FastSUN V14.0.1发布升级

2020-7-13&#xff0c;正式对外发布飞时达日照分析软件FastSUN V14.0.1(32/64)&#xff0c;本次为小版本升级发布。温馨提醒&#xff1a;本次升级以安装包更新的方式发行&#xff0c;原14.0版本不需要卸载可直接覆盖安装本更新安装包14.0.1。飞时达日照分析软件FastSUN V14.0.1…

高频变压器_变压器图案

高频变压器Transformer模式是Java&#xff08;以及可能仅具有使用场所差异和不变参数类型的其他OO语言&#xff09;的设计模式&#xff0c;可帮助子类型层次结构内的对象将自己流畅地转换为任何类型的对象。 语境 我一直在关注与Jim Laskey发行的JDK-8203703有关的OpenJDK线程…

linux文件 run.man,【Linux】linux经常使用基本命令

Linux中很多经常使用命令是必须掌握的&#xff0c;这里将我学linux入门时学的一些经常使用的基本命令分享给大家一下&#xff0c;希望能够帮助你们。这个是我将鸟哥书上的进行了一下整理的&#xff0c;希望不要涉及到版权问题。1、显示日期的指令&#xff1a; date2、显示日历的…

guid会重复吗_知网查重会查重表格吗

知网查重会查重表格吗&#xff1f;答案是肯定的。如果出现知网查重表格重复很高&#xff0c;那么我们一样是会进行避免查重的&#xff0c;通常表格在查重后会在报告中展示&#xff0c;如果出现重复会提示大家&#xff0c;我们只需要根据这个提示进行修改降低表格查重率即可。那…

stripe pay_J2Pay –简介

stripe pay介绍 J2Pay是用于Java的开源多网关支付库&#xff08;由tranxactive提供&#xff09;。 该库的主要目的是为多个网关同时提供简单而通用的请求/响应&#xff0c;它也排除了网关文档的阅读。 如果您尝试在网关上工作&#xff0c;则不必阅读文档&#xff0c;因为该库具…

windows远程桌面_如何使用Windows远程桌面连接Ubuntu 干货

近期网盾科技给大家分享了一些教程类的干货&#xff0c;有很多小伙伴都收藏了网盾科技的文章&#xff0c;能对大家有帮助就好。今天网盾科技再给小伙伴们讲解一下如何使用Windows远程桌面连接Ubuntu&#xff0c;干货收藏&#xff01; Windows连接已有界面的Linux 看了许多教程都…

android 单元测试 多线程,单元测试多线程Android RxJava

您可以编写自己的ThreadFactoryThreadFactory custom new CustomThreadFactory();ExecutorService executorService Executors.newCachedThreadPool(custom); //or use newSingleThreadExecutor(..)Scheduler customScheduler Schedulers.from(executorService); 现在你可以…

Servlet中获取文件在服务器主机的真实路径

package priv.lwx.javaex.servlet_demo.web.servletcontext; /*** 获取文件在服务器主机的真实路径** author liaowenxiong* date 2022/1/12 15:34*/import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet…

wxpay-api:pay_J2Pay – API响应

wxpay-api:pay介绍 该库中的神奇之处在于&#xff0c;无论网关是什么&#xff0c;其响应都是唯一的。 了解API响应后&#xff0c;您便可以轻松地将此响应用于进一步的交易&#xff0c;例如退款&#xff0c;作废或重新开票。 首先&#xff0c;在开始阅读时&#xff0c;所有响应…

Android设置toolbar高度,Android基础知识之 Toolbar 的使用

Toolbar是Android5.0推出的,用来替代ActionBar的控件.可以高度的自定义,使用灵活.官方的ToolBar是必须在5.0以上的系统才能使用,如果需要在低版本中使用.需要使用support v7包中的Toolbar.下一是官网的Toolbar的介绍:Toolbarextends ViewGroupjava.lang.Object↳ android.view.…

delphi 停电文本数据丢失_概述DCS系统正确停电和上电的步骤

欢迎关注“热控圈 ” ID&#xff1a;rekongquan传播热控知识&#xff0c;分享技术精华&#xff01;如何由入门到精通学会西门子PLC系统&#xff1f;扫码关注“电力工程学”&#xff0c;系列视频正在播出&#xff01;在因大修或者其他原因需要对DCS进行断电维护时&#xff0c;我…

获取文件的MIME类型

package priv.lwx.javaex.servlet_demo.web.servletcontext; /*** 获取MIME类型** author liaowenxiong* date 2022/1/12 15:34*/import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.annotation.*; import java.io.File; import java.io.IOException;…

jcmd_jcmd,大约JDK 11

jcmdNicolasFrnkel最近在博客文章“ 行业工具OpenJDK 11 ”中发布了与OpenJDK 11一起提供的命令行工具的调查。 在那篇文章中&#xff0c;他简要总结了工具jps &#xff08;一个JVM进程状态工具 &#xff09;&#xff0c; jinfo &#xff08;一个JVM配置详细信息 &#xff09;&…

vscode 运行vue_Vue初体验

Vue的引入要使用 Vue&#xff0c;我们可以直接在 Vue.js 的官网直接下载 vue.min.js 文件&#xff0c;然后在 HTML 页面中通过 <script> 标签来引入这个文件。下载地址为&#xff1a;https://vuejs.org/js/vue.min.js。引入格式如下所示&#xff0c;其中 path 是文件所在…

android图标随着进度条动画,Android开发之ProgressBar字体随着进度条的加载而滚动...

在网上翻阅了很多关于ProgressBar滚动效果&#xff0c;但是始终没有找到适合项目中的这种效果&#xff0c;故自己写这篇文章&#xff0c;记录一下写作过程&#xff0c;给大家做一个参考。先看下最终效果效果图我这里用的是LICEcap软件录制的gif图&#xff0c;效果有点掉帧&…

spark ui_Spark UI的见解

spark ui作为apache-spark-job解剖的后续文章&#xff0c;我将分享您如何使用Spark UI进行作业调整。 我将继续使用先前文章中使用的相同示例&#xff0c;新的spark应用程序将在以下方面完成工作 –阅读纽约市停车票 –通过“板ID”进行汇总并计算违规日期 –保存结果 此代…

Android布局加载慢,Android布局优化(四)X2C — 提升布局加载速度200%

系列文章前言在Android布局优化(一)从布局加载原理说起中我们说到了布局加载的两大性能瓶颈&#xff0c;通过IO操作将XML加载到内存中并进行解析和通过反射创建View。这里介绍一种避免运行时通过IO操作读取布局文件的“黑科技”—X2C。个人认为这个技术在实际项目中使用可能会需…

api 获取网络使用情况_您的API是什么情况?

api 获取网络使用情况免责声明&#xff1a;在纯REST中&#xff0c;API是不透明的&#xff0c;URL应该是对先前请求的响应中作为链接发送的内容。 但是&#xff0c;我不是在讲纯REST&#xff0c;而是在讲更实用的API&#xff0c;其中涉及REST的一些概念以及通用的API最佳实践。 …

判断字符串是不是application/x-www-form-urlencoded字符串(URL编码格式的字符串)

import java.util.BitSet;/*** 判断一个字符串是不是URL编码字符串的工具类&#xff0c;即判断字符串是不是application/x-www-form-urlencoded字符串** author liaowenxiong* date 2022/1/14 11:32*/public class URLEncodeUtils {private static BitSet bitSet;static {bitSe…