当前位置: 首页 > java >正文

那些年踩过的坑之Arrays.asList

一、前言

        熟悉开发的兄弟都知道,在写新增和删除功能的时候,大多数时候会写成批量的,原因也很简单,批量既支持单个也支持多个对象的操作,事情也是发生在这个批量方法的调用上,下面我简单说一下这个事情。

二、场景描述

        批量方法的参数可能是一个list集合,里面存放了多个待操作的数据,这是批量方法。当我们操作单个对象的时候,也需要调用批量,那传参的时候,就涉及到把单个对象封装成集合,那么封装的方式有几种,我下边罗列一下。

    @Testpublic void listTest(){String code = "ITEM-001";//方式1batchOperate(Arrays.asList(code));//方式2batchOperate(Collections.singletonList(code));//方式3batchOperate(CollectionUtil.newArrayList(code));}

        我罗列了3种方式,但是我见过最多的就是使用第一种方式Arrays.asList(code),如果用了第一种的话,此时IDEA会给个小黄标提示,有点代码洁癖的人,会按照IDEA推荐的方式进行进一步修改,也就是我们第二种方式Collections.singletonList(code)。

        对于我个人来说,我推荐用第三种,而且我本人也是使用第三种传参方式,下面我们运行一下代码,首先我们来看一下第一种传参方式。

        通过运行代码,居然报add方法报错,是不是脑瓜子嗡嗡的?我们打个断点看一下,如下图所示,我们发现此时进行add方法的list是不是有点奇怪,不是我们常见的java.util下的ArrayList呀,为了更清晰,我们再深入一下,看看Arrays.asList是怎么一回事。

        进入到Arrays源码中,我们看到此ArrayList非彼ArrayList,而是Arrays的一个内部类,而且再仔细看看,发现这个内部类中居然没有add方法,但是确真真实实调用了add方法,它没有的话,应该是它所继承的父类中有add方法,我们继续进入到父类AbstractList中一探究竟。

        在AbstractList中,我们终于把add方法给揪出来了,从截图中可以看到,add方法中直接抛出了throw new UnsupportedOperationException(),这也就解释了为什么在调用add方法的时候报错了。

        来我们继续再看下一个Collections.singletonList(code)是怎么个情况

        果然,也报错了,而且报的错都一样,那么原因和刚才也大差不差。我们再点进去看看源码是什么样的。

        通过截图,我们可以看到,SingletonList也是Collections的一个内部类,而且也没有add方法,并且也继承自AbstractList,这时候就很明确了,调用add方法就会直接报错。我们顺便再看看其他的操作方法(如下图所示),基本上也都是报错,说明继承自AbstractList的子类是不允许对集合进行操作的。

        最后再看一下小永哥的选择测试结果会怎么样(希望不会翻车......)

        通过测试截图可以看到,没毛病,情况我们就分析到这里了。日常开发过程中应该用哪一种我想现在已经很明确了。

三、焦点访谈

        T哥:小永哥,有没有人说你很装呢?

        小永哥:好像除了你之外,还没有。

        T哥:你说的这三种传参有什么意义吗?随便一种都行吧,像你说的那种情况基本上不可能发生。

        小永哥:你说的有你的道理,但是谁能保证自己调用的方法都是自己写的,绝对安全可靠,我把参数传过去,人家想这么处理,完全不是我能控制的,但是因为传参的问题导致了报错,是不是得排查,为什么能一次性搞定的东西,要继续浪费时间和精力去处理呢?

        T哥,这次算你有道理.........

四、结语

        我分享的这些绝不是为了装,像这种看似简单,但是平时不常见的错误,解决不也得花时间吗,如果是生产环境报错,那排查、定位、解决花费的时间更多,有这功夫,我们摸会鱼,喝点咖啡它不香嘛。

        今天就分享到这里,谢谢大家,晚安。

        

http://www.xdnf.cn/news/1971.html

相关文章:

  • CC攻击的类型都有哪些?
  • eclipse怎么导入junit4
  • 解读《数据资产质量评估实施规则》:企业数据资产认证落地的关键指南
  • MCP(Model Context Protocol)
  • AlarmClock4.8.4(官方版)桌面时钟工具软件下载安装教程
  • Zephyr kernel Build System (CMake)介绍
  • MySQL引擎分类与选择、SQL更新底层实现、分库分表、读写分离、主从复制 - 面试实战
  • 数字浪潮下的算力担当:GPU 服务器的多元应用、核心价值
  • 技术探索之路:从自我认知到成长规划
  • 实现层归一化
  • 数据结构------C语言经典题目(7)
  • 【T-MRMSM】文本引导多层次交互多尺度空间记忆融合多模态情感分析
  • 基于cesium实现鼠标移动动态绘制矩形和圆
  • Rust 学习笔记:函数和控制流
  • React 中什么时候用事件总线
  • 微信小程序直传阿里云 OSS 实践指南(V4 签名 · 秒传支持 · 高性能封装)
  • ROS1、ROS2如何把预编译好的二进制文件封装成功能包?
  • 【Django】新增字段后兼容旧接口 This field is required
  • 代码随想录:数组
  • 如何实现Android屏幕和音频采集并启动RTSP服务?
  • 如何使用@KafkaListener实现从nacos中动态获取监听的topic
  • 【Hive入门】Hive数据导出完全指南:从HDFS到本地文件系统的专业实践
  • 利用JMeter代理服务器方式实现高效压测
  • Leetcode 2845 题解
  • C++_数据结构_详解红黑树
  • 微软官网Win10镜像下载快速获取ISO文件
  • 第18章:MCP在创作领域中的应用
  • Java集成Redisson实现分布式锁(实战)
  • 学生管理系统微服务方式实现
  • WebUI可视化:第3章:Gradio入门实战