我之前曾在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类的用于获取空集合的方法比使用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中的类型安全的空集合相关推荐

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

    java中集合判空 我以前曾在Java Collections类的实用程序上进行过博客撰写,并且特别地在使用Usings Collections Methods上的博客emptyList(),empt ...

  2. 检查Java中的字符串是空还是空[重复]

    本文翻译自:Checking if a string is empty or null in Java [duplicate] This question already has an answer ...

  3. java中给对象的List集合去重的几种方法(Lambda)

    java中给对象的List集合去重的几种方法 前言 一.lambda表达式的去重方式 二.Stream API中的collect去重方法 三.Stream API 中的distinct方法去重 前言 ...

  4. java 中的多种判空方式

    前言   如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^.   而且听说点赞的人每天的运气都不会太差,实在白嫖的话,那欢迎常来啊!!! java 中的多种判空方式 1 ...

  5. Java中String字符串:空字符串、存放空的字符串、null的区别

    Java中String字符串:空字符串.存放空的字符串.null的区别 Java String字符串中有三种特殊的字符串:空字符串.存放空的字符串.字符串为Null,如下所示: String str1 ...

  6. java中map可以为空吗_Java: Map里面的键和值可以为空吗?

    在Java中,Map里面的键和值可以为空吗?我们先来看一个例子: private static void TestHashMap() { // TODO Auto-generated method s ...

  7. java中map可以为空吗_检查NavigableMap是否在Java中为空

    Java中使用isEmpty()方法检查NavigableMap是否为空. 首先,创建一个NavigableMap并向其中添加元素-NavigableMap n = new TreeMap(); n. ...

  8. java中String值为空字符串与null的判断方法

    Java空字符串与null的区别 1.类型        null表示的是一个对象的值,而不是一个字符串.例如声明一个对象的引用,String a=null.        ""表 ...

  9. java中数据结构的应用_Java集合入门 (二)常用数据结构和应用场景-数组

    Java极客  |  作者  /  铿然一叶 这是Java极客的第 48 篇原创文章 一.数组的特点 1.数组大小固定 2.一个数组只能存储相同数据类型 3.随机访问性能高 4.存储空间连续,这样可以 ...

最新文章

  1. RAID0、RAID1、RAID0+1模式实战评测
  2. Blogengine-BlogRoll的两个bug
  3. redis desktop manager download
  4. resnet50训练imagenet记录
  5. 数据科学学习心得_学习数据科学
  6. 如何看待快手领投知乎4.34亿美元融资?创始人周源亲自下场回答
  7. 这几行代码,真的骚!
  8. java中异常抛出后代码还会继续执行吗
  9. odis工程师一键导入导出匹配数据信息功能_机械重复做了这么久,才发现竟然可以批量用户导入导出...
  10. [转载] Python基于机器学习方法实现的电影推荐系统
  11. eclipse导入不到嵌套的项目
  12. 多层json字符串转map_java json字符串转map集合递归嵌套
  13. gom引擎物品和武器的外观Shape值拓展算法
  14. word有空白段删不掉 解决办法
  15. Rayman的绝顶之路——Leetcode每日一题打卡21
  16. ebtables日志nflog
  17. vivo电池损耗指令代码_「值得收藏」手机上的神奇代码,除了*#*#6485#*#*,还有这些...
  18. 码链的重大突破,提升国产二维码技术话语权
  19. 电脑如何备份文件,怎么同步?
  20. java内置监视管理控制台

热门文章

  1. 9.2-控制单元CU的功能(学习笔记)
  2. 'webpack-dev-server' 不是内部或外部命令,也不是可运行的程序 或批处理文件的解决方法(webpack热加载)
  3. java计算混淆矩阵(分类指标:查准率P,查全率R,P和R的调和均值F1,正确率A)
  4. MySQL的自然联结+外部联结(左外连接,右外连接)+内部联结
  5. 控制台查出数据传到layui数据表格却没有数据的问题
  6. spring安全性_具有PreAuthorize的Spring方法安全性
  7. maven原型_创建自定义Maven原型
  8. 运行单个源文件_使用一个命令执行单个Java源文件
  9. java10个基础错误_我们处理了10亿个Java记录的错误-这是导致97%的错误的原因
  10. jsp导入jstl标签库_EE JSP:使用JSTL标记库生成动态内容