FindBugs 引发了一个由 Array 引起的名为 EI_EXPOSE_REP 的错误

2024-01-14

FindBugs 提出了一个名为 EI_EXPOSE_REP 的错误,其描述如下:

EI:可以通过返回对可变对象的引用来公开内部表示

返回对存储在对象字段之一中的可变对象值的引用会公开该对象的内部表示形式。如果实例由不受信任的代码访问,并且对可变对象进行未经检查的更改会危及安全性或其他重要属性,则您将需要执行不同的操作。在许多情况下,返回对象的新副本是更好的方法。

class Person {
    private String[] hobbies;
    String[] getHobbies(){ return hobbies;}
    void setHobbies(String[] hobbies){ this.hobbies = hobbies;}
}

我知道一些解决办法:

  1. getHobbies(){返回hobbies.clone();}
  2. 使用列表代替数组;

我想知道的是为什么只有数组会引发这个错误,列表没有这个问题?为什么数组与其他集合有如此不同?


Findbugs(现已被 Spotbugs 取代)引发了安全问题。这不是一个错误,因为它本身不会产生不需要的行为。但是这种内部数据的暴露可能会在调用者方法中产生错误。

您猜对了,有两种方法可以保护您的 getter 免受暴露:

  • 返回数组的副本Arrays.copyOf(..)
  • 将其转换为“不可变”列表Collections.unmodifiableList(..)(您也可以使用List.of(..)从 Java 9 开始)

A List除非不可修改,否则会发出类似的警告。 这是一个很好的使用习惯Collections代替Arrays除非你确实有充分的理由不这样做。


在某些情况下,当您的写入次数很少而读取次数较多时,该类CopyOnWriteArrayList是一个简单的不可变列表 getter 的绝佳替代方案。


我想知道为什么只是数组会引发这个错误。
这只是一个警告。 Findbugs 在报告旁边显示严重性级别。
对于安全性而言,暴露程度为中等,但对于错误而言,暴露程度较低。

列表就没有这个问题吗?
确实如此。 ArrayList 只是一个带有附加抽象层的数组。

为什么数组与其他集合如此不同?
数组是本机类型,而集合则不是。
行为类似,但您对数组的控制比对集合的控制要少。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FindBugs 引发了一个由 Array 引起的名为 EI_EXPOSE_REP 的错误 的相关文章

随机推荐

  • Python 格式最佳实践

    我刚刚熟悉 Python 并且有一个关于在字符串上使用 format 的最佳实践 或至少是常见实践 的问题 我的问题主要是关于何时使用空白大括号 索引号和名称 例如 如果您想将一个变量包含在字符串中 您会选择哪一个 print I Stac
  • NASM:磁盘读取超时

    尝试从磁盘 从同一文件 读取数据 将另外 2 个 512 字节扇区加载到内存中 磁盘读取功能如下 read DH sectors to ES BX from drive DL disk read push dx push bx Tried
  • Google Apps 脚本 location.reload 在网络应用程序中

    我正在使用一个 GAS Web 应用程序 当用户执行某些操作 例如单击特定的 div 时 该应用程序需要刷新其内容 在客户端 我有一个从 onclick 调用的脚本 google script run withSuccessHandler
  • 在 swift 3 iOS 中实现谷歌翻译 api

    你好 我是 iOS 开发新手 我正在尝试在我的应用程序中实现谷歌翻译 API 我从GitHub上在线找到了一些示例代码https github com prine ROGoogleTranslate https github com pri
  • 无法更改 rgl 图中的文本大小

    我在更改使用 rgl 包生成的 3d 绘图的文本大小时遇到 问题 一切工作正常 但我无法有效地更改 3d 对象的 cex 属性 我在 64 位 Ubuntu 10 04 LTS 2 6 32 37 generic 下运行 R 2 14 1
  • 构造函数中的同步以使其发生在之前

    我有一个关于如何通过 Java 内存模型保证对象是线程安全的问题 我读过很多文章 说在构造函数中编写同步作用域没有意义 但为什么没有意义呢 是的 确实 只要正在构造的对象不在线程之间共享 这不应该是 除了构造线程之外 没有任何线程可以到达任
  • 与 ARM LDR 指令关联的哈希 (#) 值是什么意思?

    我正在尝试调试我的应用程序中遇到的崩溃 堆栈跟踪指向具有以下格式的 LDR 指令 感谢反汇编程序 LDR R3 R0 4 我的问题是关于源组件的 第二个参数中的 4是什么意思 我假设它是某种偏移量 但我还没有找到支持 LDR 指令的文档 它
  • DataTable 和线程安全

    我将 DataTable 存储在 ASP NET Cache 属性中 可以对该 DataTable 执行的操作有 绑定到网格控件 第 3 方网格内部管理数据源对象 回发后其 DataSource 为 NULL 我假设一旦绑定数据 它就不再使
  • MavenProject:获取在我的插件上使用的可用类

    我正在按照描述加载 Maven 项目here https stackoverflow com questions 4381460 get mavenproject from just the pom xml pom parser 我正在尝试
  • 定期分割字符串

    我想定期分割字符串 我的问题与这个问题几乎相同 如何将一个字符串分割成给定长度的子串 https stackoverflow com questions 11619616 how to split a string into substri
  • SubSonic 和存储过程

    使用 SubSonic 时 您是否将数据作为数据集返回 或者将其放入强类型自定义集合或通用对象中 我运行了 subsonic 项目 对于数据库中的四个存储过程 它为我提供了一个 Sps cs 其中包含 4 个返回 StoredProcedu
  • 如何访问数组的对象(stdClass 对象)成员/元素的属性? [复制]

    这个问题在这里已经有答案了 Doing print r 在我的阵列上我得到以下信息 Array 0 gt stdClass Object id gt 25 time gt 2014 01 16 16 35 17 fname gt 4 tex
  • 双除法的错误行为

    我有一个HashMap called List
  • 如何在 Antd 表中使用 Radio 组?

    我想这样做 每一行都是一个Radio组 每个单元格都是一个Radio按钮 如图 Radio 组的示例如下
  • python中的循环引用

    我不确定python如何处理循环引用 引用循环 我检查了一些答案并发现this https stackoverflow com questions 8025888 does python gc deal with reference cyc
  • Android - 返回调用 Activity

    来自 iPhone 开发人员的新手问题 我已调用 startActivity intent 并加载新活动 按下按钮后如何 返回 调用活动 基本上将活动从堆栈中 弹出 如果您使用以下命令创建了新活动startActivity http dev
  • Camel从类路径资源读取文件?

    我在 Spring Boot 应用程序的 resources file txt 的类路径上有一个文件 我如何在骆驼路线中引用它 我努力了 from file resource classpath fileName file txt 及其变体
  • 死代码识别(C++)

    我有一个在 Visual Studio 2008 下编译的大型遗留 C 项目 我知道有相当数量的 死 代码无法在任何地方访问 未调用的方法 未使用的整个类 我正在寻找一个可以通过以下方式识别这一点的工具静态分析 这个问题 遗留 C C 项目
  • iOS 企业部署:单击 itms-services 链接会导致“无法连接到 [domain]”错误

    为了部署企业 iOS 应用程序 我创建了以下链接 未编码版本 为了方便阅读 a href Download a 编码版本 a href Download a 正如所讨论的 链接已正确编码here https stackoverflow co
  • FindBugs 引发了一个由 Array 引起的名为 EI_EXPOSE_REP 的错误

    FindBugs 提出了一个名为 EI EXPOSE REP 的错误 其描述如下 EI 可以通过返回对可变对象的引用来公开内部表示 返回对存储在对象字段之一中的可变对象值的引用会公开该对象的内部表示形式 如果实例由不受信任的代码访问 并且对