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类的用于获取空集合的方法比使用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

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

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

相关文章

php cpu mac,PHP 获得计算机的唯一标识[CPU,网卡 MAC地址]

//获取电脑的CPU信息function OnlyU(){$a ;$b array();if(function_exists(exec)){if(mailto:!exec( /all",$b)){return false;}}elseif(function_exists(system)){ob_start();if(mailto:!system( /all")){return false;}else{}$b ob_get_contents();ob_end_clean…

剑指offer二十二之从上往下打印二叉树

一、题目 从上往下打印出二叉树的每个节点&#xff0c;同层节点从左至右打印。 二、思路 二叉树的层次遍历&#xff0c;可以借助队列实现。具体思路详见注释。 三、代码 import java.util.ArrayList; import java.util.LinkedList; /** public class TreeNode {int val 0;Tree…

arduino i2c 如何写16位寄存器_arduino入门

硬件&#xff1a;Arduino Uno是基于ATmega328P(数据表)的微控制器板。它具有14个数字输入/输出引脚(其中6个可用作PWM输出)&#xff0c;6个模拟输入&#xff0c;工作电压5v&#xff0c;输入电压7-12v。串行&#xff1a;0(RX)和1(TX)用于接收(RX)和发送(TX)TTL串行数据。这些引脚…

原生JS实现banner图的滚动与跳转

HTML部分&#xff1a; <div id"banner"><!--4张滚动的图片--><div id"inside"><img src"../../img/14072415363339_0.jpg"><img src"../../img/14072415383924_0.jpg" id"img2" /><img sr…

Java中的紧凑堆外结构/组合

在上一篇文章中&#xff0c;我详细介绍了代码对主内存的访问方式的含义。 从那时起&#xff0c;我对使用Java可以做什么以实现更可预测的内存布局有很多疑问。 有些模式可以使用数组支持的结构来应用&#xff0c;我将在另一篇文章中讨论。 这篇文章将探讨如何模拟Java中非常缺少…

java字符集编码是,java字符集与编码有关问题

java字符集与编码问题没想到自己的第一篇javaeye博客就是让人头痛的java字符集转码问题&#xff0c;下面是我个人的一些认识与网上收集的代码。在java中String在JVM里是unicode的&#xff0c;任何byte[]到String以及String到byte[]都涉及到字符集编码转换。基本规则是&#xff…

mysql序列号生成_一文看懂mycat的6种全局序列号实现方式

概述在实现分库分表的情况下&#xff0c;数据库自增主键已无法保证自增主键的全局唯一。为此&#xff0c;MyCat 提供了全局sequence&#xff0c;并且提供了包含本地配置和数据库配置等多种实现方式。下面对这几种实现方式做一下介绍。1、本地文件方式原理&#xff1a;此方式 My…

android.graphics.Paint方法setXfermode (Xfermode x...

[java] view plaincopymPaint new Paint(); mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SCREEN)); 常见的Xfermode&#xff08;SRC为原图&#xff0c;DST为目标图&#xff09;&#xff0c;把代码中的SRC_IN换成下图指定的模式就会出现对应的效果图…

从零开始的全栈工程师——html篇1

全栈工程师也可以叫web 前端 H5主要是网站 app 小程序 公众号这一块 HTML篇 html(超文本标记语言&#xff0c;标记通用标记语言下的一个应用。) “超文本”就是指页面内可以包含图片、链接&#xff0c;甚至音乐、程序等非文字元素。 超文本标记语言的结构包括“头”部分&am…

二分+树的直径 [Sdoi2011]消防

问题 D: [Sdoi2011]消防 时间限制: 1 Sec 内存限制: 512 MB 提交: 12 解决: 6 [提交][状态][讨论版] 题目描述 某个国家有n个城市&#xff0c;这n个城市中任意两个都连通且有唯一一条路径&#xff0c;每条连通两个城市的道路的长度为zi(zi<1000)。 这个国家的人对火焰…

使用MRUnit测试Hadoop程序

这篇文章将略微绕开使用MapReduce实现数据密集型处理中的模式&#xff0c;以讨论同样重要的测试。 汤姆•惠勒 &#xff08; Tom Wheeler&#xff09;在纽约2012年Strata / Hadoop World会议上参加的一次演讲给了我部分启发。 处理大型数据集时&#xff0c;想到的并不是单元测试…

android之 TextWatcher的监听

以前用过android.text.TextWatcher来监听文本发生变化&#xff0c;但没有仔细去想它&#xff0c;今天兴致来了就发个疯来玩玩吧&#xff01; 有点担心自己理解错&#xff0c;所以还是先把英文API解释给大家看看 1、什么情况下使用了&#xff1f; When an object of a type is a…

php 秒杀并发怎么做,PHP实现高并发下的秒杀功能–Laravel

namespace App\Http\Controllers\SecKill;use App\Http\Controllers\Controller;use Exception;use Illuminate\Support\Facades\DB;use Illuminate\Support\Facades\Redis;class SecKillController extends Controller{/*** 往redis的隊列中添加庫存(用於測試的數據)**/public…

苹果mp3软件_优秀的Apple音乐转换器,将任何iTunes M4P,AAX,AA转换为MP3

Macsome iTunes Converter是一款优秀的音频转换工具&#xff0c;这款音频转换软件能够帮助大家快速进行音频格式转换&#xff0c;使得您可以自由的播放和分享自己喜爱的音频文件。同时这款软件与大多数音频转换软件一样&#xff0c;将受到保护DRM的Apple音乐转换转换成MP3, AAC…

Vuejs开发环境搭建及热更新

一、安装NPM 1.1最新稳定版本&#xff1a; npm install vue 二、命令行工具安装 国内速度慢&#xff0c;使用淘宝镜像&#xff1a; npm install -g cnpm --registryhttps://registry.npm.taobao.org 注意&#xff1a;以后使用npm的地方就替换成cnpm 1、全局安装vue-vli ​ …

线索二叉树的C语言实现

#include "string.h"#include "stdio.h" #include "stdlib.h" #include "io.h" #include "math.h" #include "time.h" #define OK 1#define ERROR 0#define TRUE 1#define FALSE 0 #define MAXSIZE 100 /* 存储空…

发送带有接缝的活动邀请

这些天来&#xff0c;我的一位同事在使用带有接缝&#xff08;2.x版&#xff09;的邮件模板发送事件邀请时遇到了问题。 从根本上讲&#xff0c;这不是一个艰巨的任务&#xff0c;因此我将简要说明使用接缝邮件模板发送事件邀请需要做什么。 发送邮件邀请时&#xff0c;您需要发…

Oracle内存管理(之二)

Oracle内存管理&#xff08;之二&#xff09; 【深入解析--eygle】 学习笔记 1.2.2 UGA和CGA UGA&#xff08;用户全局区&#xff09;由用户会话数据、游标状态和索引区组成。在共享server模式下&#xff0c;一个共享服务进程被多个用户进程共享&#xff0c;此时UGA是Shared Po…

matlab抓取股票数据,Matlab经过sina web接口获取个数即时股票数据函数实现代码

Matlab通过sina web接口获取个数即时股票数据函数实现代码代码如下&#xff1a;function stockinfo queryprice(stocktype, stockid)%stocktype 股票类型&#xff1a;sh和sz%stockid 股票编码&#xff1a;url sprintf(http://hq.sinajs.cn/list%s%d, stocktype, stockid);[so…

虚幻4毛发系统_虚幻引擎复活!苹果与Epic对决,有哪些游戏险些中枪?

最近&#xff0c;苹果和Epic的官司闹得沸沸扬扬。随着Epic旗下热门手游《堡垒之夜》遭苹果火速下架&#xff0c;两大巨头之间的冲突愈演愈烈。苹果似乎并不满足于此&#xff0c;由于Epic公开违反自家规定&#xff0c;苹果计划进一步封禁Epic维护虚幻引擎的开发者账户&#xff0…