java中集合判空_Java中的类型安全的空集合

java中集合判空

我以前曾在Java Collections类的实用程序上进行过博客撰写,并且特别地在使用Usings Collections Methods上的博客emptyList(),emptyMap()和emptySet()上进行了博客撰写。 在本文中,我将探讨使用Collections类的相关字段访问空集合与使用Collections类的相关方法访问空集合之间有时细微但重要的区别。

以下代码演示了直接访问Collections的字段以指定空集合。

将集合的字段用于空集合

/*** Instantiate my collections with empty versions using Collections fields.* This will result in javac compiler warnings stating 'warning: [unchecked]* unchecked conversion'.*/public void instantiateWithEmptyCollectionsFieldsAssigment(){this.stringsList = Collections.EMPTY_LIST;this.stringsSet = Collections.EMPTY_SET;this.stringsMap = Collections.EMPTY_MAP;      }

上面的代码使用javac进行编译 ,但是导致出现警告消息(在这种情况下,该消息由NetBeans和Ant生成):

-do-compile:[javac] Compiling 1 source file to C:\java\examples\typesafeEmptyCollections\build\classes[javac] Note: C:\java\examples\typesafeEmptyCollections\src\dustin\examples\Main.java uses unchecked or unsafe operations.[javac] Note: Recompile with -Xlint:unchecked for details.

将-Xlint:unchecked指定为 javac的参数(在这种情况下,通过NetBeans project.properties文件中的javac.compilerargs=-Xlint:unchecked )有助于获取前面列出的代码的更具体的警告消息:

[javac] Compiling 1 source file to C:\java\examples\typesafeEmptyCollections\build\classes[javac] C:\java\examples\typesafeEmptyCollections\src\dustin\examples\Main.java:27: warning: [unchecked] unchecked conversion[javac]       this.stringsList = Collections.EMPTY_LIST;[javac]                                     ^[javac]   required: List<String>[javac]   found:    List[javac] C:\java\examples\typesafeEmptyCollections\src\dustin\examples\Main.java:28: warning: [unchecked] unchecked conversion[javac]       this.stringsSet = Collections.EMPTY_SET;[javac]                                    ^[javac]   required: Set<String>[javac]   found:    Set[javac] C:\java\examples\typesafeEmptyCollections\src\dustin\examples\Main.java:29: warning: [unchecked] unchecked conversion[javac]       this.stringsMap = Collections.EMPTY_MAP;      [javac]                                    ^[javac]   required: Map<String,String>[javac]   found:    Map

如果在其选项中选中了适当的提示框,则NetBeans还将显示这些警告。 接下来的三个图像演示如何确保设置适当的提示以查看NetBeans中的这些警告,并提供一个示例,说明NetBeans如何将上面显示的代码与警告一起呈现。

幸运的是,很容易利用Collections类的实用程序并以类型安全的方式访问空集合,而不会导致这些javac警告和相应的NetBeans提示。 这种方法是使用Collections方法而不是其字段 。 下一个简单的代码清单对此进行了演示。

对空集合使用集合的方法

/*** Instantiate my collections with empty versions using Collections methods.* This will avoid the javac compiler warnings alluding to 'unchecked conversion'.*/public void instantiateWithEmptyCollectionsMethodsTypeInferred(){this.stringsList = Collections.emptyList();this.stringsSet = Collections.emptySet();this.stringsMap = Collections.emptyMap();}

上面的代码将编译而不会发出警告,并且也不会显示任何NetBeans提示。 Collections类的每个字段的Javadoc文档都没有解决为什么这些字段会出现这些警告的问题,但是每个类似方法的文档都对此进行了讨论。 具体来说,有关Collections.emptyList() , Collections.emptySet()和Collections.emptyMap()的文档每个状态为“((不同于此方法,该字段不提供类型安全性。)”

对最后一个代码清单中显示的空集合使用Collections方法可提供类型安全性,而无需显式指定存储在该集合中的类型,因为类型是通过使用Collections方法在对已知和已经声明的实例属性的赋值中显式地推断出来的指定的元素类型。 如果无法推断类型,则在使用没有显式指定类型的Collections方法时将导致编译器错误 。 下一个尝试在NetBeans中执行此操作的屏幕快照中显示了这一点。

特定的编译器错误消息是:

[javac] C:\java\examples\typesafeEmptyCollections\src\dustin\examples\Main.java:62: error: method populateList in class Main cannot be applied to given types;[javac]       populateList(Collections.emptyList());[javac]       ^[javac]   required: List<String>[javac]   found: List<Object>[javac]   reason: actual argument List<Object> cannot be converted to List<String> by method invocation conversion[javac] C:\java\examples\typesafeEmptyCollections\src\dustin\examples\Main.java:63: error: method populateSet in class Main cannot be applied to given types;[javac]       populateSet(Collections.emptySet());[javac]       ^[javac]   required: Set<String>[javac]   found: Set<Object>[javac]   reason: actual argument Set<Object> cannot be converted to Set<String> by method invocation conversion[javac] C:\java\examples\typesafeEmptyCollections\src\dustin\examples\Main.java:64: error: method populateMap in class Main cannot be applied to given types;[javac]       populateMap(Collections.emptyMap());[javac]       ^[javac]   required: Map<String,String>[javac]   found: Map<Object,Object>[javac]   reason: actual argument Map<Object,Object> cannot be converted to Map<String,String> by method invocation conversion[javac] 3 errors

通过在代码中显式指定集合元素的类型,可以避免这些编译器错误并实现类型安全。 这显示在下一个代码清单中。

使用Collections的Empty方法显式指定元素类型

/*** Pass empty collections to another method for processing and specify those* empty methods using Collections methods. This will result in javac compiler* ERRORS unless the type is explicitly specified.*/public void instantiateWithEmptyCollectionsMethodsTypeSpecified(){populateList(Collections.<String>emptyList());populateSet(Collections.<String>emptySet());populateMap(Collections.<String, String>emptyMap());}

出于相同的目的,最好使用Collections类的用于获取空collection的方法,而不是使用Collections的类似命名的字段,因为这些方法提供了类型安全性。 这样可以更好地利用Java的静态类型系统,这是诸如Effective Java这类书籍的关键主题。 一个不错的副作用是消除了混乱的警告和标记的NetBeans提示,但是更重要的结果是更好,更安全的代码。

参考: JCG合作伙伴 Dustin Marx在Inspired by Actual Events博客中提供的Java类型安全的空集合 。

翻译自: https://www.javacodegeeks.com/2012/11/type-safe-empty-collections-in-java.html

java中集合判空

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

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

相关文章

cnn验证码识别代码_中文项目:快速识别验证码,CNN也能为爬虫保驾护航

原标题&#xff1a;中文项目&#xff1a;快速识别验证码&#xff0c;CNN也能为爬虫保驾护航机器之心专栏作者&#xff1a;Nick Li随着卷积网络的推广&#xff0c;现在有各种各样的快捷应用&#xff0c;例如识别验证码和数学公式等。本文介绍了一个便捷的验证码识别项目&#xf…

CentOS yum 源的配置与使用

一、yum 简介 yum&#xff0c;是Yellow dog Updater, Modified 的简称&#xff0c;是杜克大学为了提高RPM 软件包安装性而开发的一种软件包管理器。起初是由yellow dog 这一发行版的开发者Terra Soft 研发&#xff0c;用python 写成&#xff0c;那时还叫做yup(yellow dog updat…

使用ActiveMQ Artemis在两个WildFly服务器之间构建水平JMS桥

有时有必要将不同的Message Broker连接在一起。 在企业消息传递中&#xff0c;此方案称为桥接。 可以使用JMS和其他协议&#xff08;例如AMQP&#xff0c;ActiveMQ Artemis核心协议&#xff09;来完成。 该博客文章重点介绍在WildFly中运行的JMS与两个Apache ActiveMQ Artemis …

mysql 逻辑备份 物理备份_数据库的逻辑备份和物理备份--非RMAN

数据库的逻辑备份和物理备份--非RMAN,不用借助其他工具&#xff0c;只要归档日志和物理备份就可以实现的备份数据库的备份和恢复常规而且重要&#xff0c;恢复得到理想状态逻辑备份利用EXP备份&#xff0c;从数据库提取写入操作系统文件1.可以导出一个完整的数据库2.也可以导出…

如何在myeclipse中导入jar包?

右键项目名--->Build Path—>Configure Build Path... 会弹出来一个框 在那四个选项选择 Libraries 然后再选择 右边 第二个选项Add External Jars... 然后就是你JAR的路径。一般将导入的外部包放在lib目录下。

python入门if语句练习_python入门视频:09 if语句_练习.mp4

本视频课程目录如下&#xff1a;python6天学习基础课程 ├─01天│ python入门视频&#xff1a;01 计算机组成-硬件设备.mp4│ python入门视频&#xff1a;02 计算机组成-软件设备.mp4│ python入门视频&#xff1a;03 程序的执行流程和小结_.mp4│ pyt…

spring依赖日志_Spring:设置日志记录依赖项

spring依赖日志这篇文章描述了如何在Spring中设置日志依赖。 它基于Dave Syer的帖子中提供的信息 。 这里提供有关Java日志记录框架的提醒。 该代码示例可在GitHub的Spring-Logging-Dependencies目录中找到。 Spring使用Jakarta Commons Logging API&#xff08;JCL&#xff0…

网页UTF8转换GBK后出现问号?的原因

网页UTF8转换GBK后出现问号"?"的原因 网页编码转换是进行网页解析和处理的第一步。 互联网上越来越多的网页采用UTF-8编码&#xff0c;UTF-8用1到6个字节编码UNICODE字符&#xff0c;收录了超过10万个字符&#xff0c;BMP部分也有六万多个字符 而在进行编码转换时&…

关于 Number() parsint() abs() 的区别

1. parseInt(‘’) parseInt() 函数可解析一个字符串&#xff0c;并返回一个整数。 如果第一个字符不是数字或者负号&#xff0c;parseInt() 就会返回NaN 2.Number() 函数把对象的值转换为数字 3. Math.abs(x) 取得正数和负数的绝对值 转载于:https://www.cnblogs.com/…

python怎么安装pymysql_Python 安装pyMySQL过程记录

如果你的系统不支持 pip 命令&#xff0c;可以使用以下方式安装&#xff1a;1、使用 git 命令下载安装包安装(你也可以手动下载)&#xff1a;$ git clone https://github.com/PyMySQL/PyMySQL$ cd PyMySQL/$ python3 setup.py install2、如果需要制定版本号&#xff0c;可以使用…

C++中的单例模式

单例模式也称为单件模式、单子模式&#xff0c;可能是使用最广泛的设计模式。其意图是保证一个类仅有一个实例&#xff0c;并提供一个访问它的全局访问点&#xff0c;该实例被所有程序模块共享。有很多地方需要这样的功能模块&#xff0c;如系统的日志输出&#xff0c;GUI应用必…

Spring Boot 学习笔记(三)Spring boot 中的SSM

Spring boot 下的 Spring mvc Controller&#xff1a;即为Spring mvc的注解&#xff0c;处理http请求&#xff1b; RestController&#xff1a;Spring4后新增注解&#xff0c;是Controller与ResponseBody的组合注解&#xff0c;用于返回字符串或json数据&#xff1b; package c…

c mysql日期时间格式_mysql日期和时间类型

TIME 类型TIME 类型用于只需要时间信息的值&#xff0c;在存储时需要 3 个字节。格式为 HH:MM:SS。HH 表示小时&#xff0c;MM 表示分钟&#xff0c;SS 表示秒。TIME 类型的取值范围为 -838&#xff1a;59&#xff1a;59&#xff5e;838&#xff1a;59&#xff1a;59&#xff0…

MySQL问题汇总

1.#include <mysql.h>编译出错 在阅读TrinityCore时&#xff0c;发现了解决方法和解释&#xff1a; #ifdef _WIN32 // hack for broken mysql.h not including the correct winsock header for SOCKET definition, fixed in 5.7 #include <winsock2.h> #endif #inc…

c++中union的使用,看高手们如何解释的

union主要是共享内存&#xff0c;分配内存以其最大的结构或对象为大小&#xff0c;即sizeof最大的。在C/C程序的编写中&#xff0c;当多个基本数据类型或复合数据结构要占用同一片内存时&#xff0c;我们要使用联合体&#xff1b;当多种类型&#xff0c;多个对象&#xff0c;多…

ibm aix_IBM AIX:Java进程大小监视

ibm aix本文将为您提供有关如何计算在IBM AIX 5.3 OS上运行的Java VM进程的Java进程大小内存占用量的快速参考指南。 这是我关于该主题的原始文章的补充文章&#xff1a; 如何在AIX上监视Java本机内存 。 我强烈建议所有参与生产支持或AIX上部署Java应用程序开发的人员阅读此书…

路由的使用

1 路由的基本使用: url是个函数,有四个参数,第一个参数要传正则表达式,第二参数传函数内存地址,第三个参数传默认参数,第四个是路由的别名 url(r^article/aa.html$, views.test), -路由从上往下匹配,一旦匹配成功,后面就不继续匹配了 2 路由的无名分组 url(r^test2/(\d)/(\w)$,…

Ps2022版DR5插件扩展窗口不展示及未正确签署等问题修复

前言 最近在安装DR5的时候遇到了一些报错问题&#xff0c;翻看了几篇文章找了一些实质性的方案&#xff0c;亲测有效&#xff0c;有同样问题的小伙伴自己对号入座哈。 窗口扩展不显示问题 问题 很多人第一次安装DR5时会发现这个【窗口-扩展】是灰色的&#xff0c;且没有DR5…

centos 编译mysql5.6_centos下编译安装MySQL5.6

&#xff0c;虚拟机centos6.5mini网络适配器“桥接模式”继续上一次的Apache编译后&#xff0c;编译安装MySQL5.6MySQL5.6和以前的版本不同之处在于用cmake就行编译&#xff0c;先安装cmake#yum install cmake -y1、开始下载编译MySQL5.6&#xff0c;推荐镜像网站http://mirror…

Spring Boot和多模块项目–添加模块特定的属性文件

你好&#xff01; 在本文中&#xff0c;我将向您展示几种如何在Spring Boot项目中添加模块特定的属性文件的方法。 它将介绍使属性文件可识别配置文件的手动方法以及可识别配置文件的半自动方法。 我的Github帐户上发布了一个示例项目&#xff08; https://github.com/coders-…