FindBugs 引发了一个名为 EI_EXPOSE_REP 的错误,该错误由 Array 引起
FindBugs raises a bug called EI_EXPOSE_REP caused by Array
FindBugs 提出了一个名为 EI_EXPOSE_REP 的错误,其描述如下:
EI:可以通过return对可变对象的引用公开内部表示
返回对存储在对象字段之一中的可变对象值的引用会公开对象的内部表示。如果不受信任的代码访问实例,并且对可变对象进行未经检查的更改会危及安全性或其他重要属性,则您需要采取一些不同的措施。在许多情况下,返回对象的新副本是更好的方法。
class Person {
private String[] hobbies;
String[] getHobbies(){ return hobbies;}
void setHobbies(String[] hobbies){ this.hobbies = hobbies;}
}
我知道一些解决办法:
- getHobbies(){return hobbies.clone();}
- 使用列表代替数组;
我想知道的是为什么只有array有这个bug,list没有这个问题?为什么数组与其他集合有如此大的不同?
Findbugs(现已被 Spotbugs 取代)提出了一个安全问题。它不是错误,因为它本身不会产生不需要的行为。但是这种内部数据的暴露可能会在以后的调用方方法中产生错误。
您猜对了,有两种方法可以保护您的 getter 免受暴露:
- Return 数组的副本
Arrays.copyOf(..)
- 用
Collections.unmodifiableList(..)
将其转换为 "Immutable" 列表(你也可以使用 List.of(..)
因为 Java 9)
A List
将发出类似的警告,除非不可修改。
最好使用 Collections
而不是 Arrays
除非你真的有充分的理由不这样做。
在某些情况下,当您的写入很少而读取很多时,Class CopyOnWriteArrayList
是拥有简单的不可变列表 getter.
的绝佳选择
我想知道为什么数组会引发这个错误。
这只是一个警告。 Findbugs 在报告旁边显示严重性级别。
安全性中等曝光率,但错误率较低。
一个列表没有这个问题?
确实如此。 ArrayList 只是一个带有附加抽象层的数组。
为什么数组与其他集合如此不同?
数组是原生类型,而集合不是。
行为类似,但您对 Array 的控制不如对 Collection 的控制。
我的 POJO class 中的 byte[] 变量出现了这个问题。如果需要,可以使用注释来抑制它:@SuppressFBWarnings(value = {"EI_EXPOSE_REP", "EI_EXPOSE_REP2"})
FindBugs 提出了一个名为 EI_EXPOSE_REP 的错误,其描述如下:
EI:可以通过return对可变对象的引用公开内部表示
返回对存储在对象字段之一中的可变对象值的引用会公开对象的内部表示。如果不受信任的代码访问实例,并且对可变对象进行未经检查的更改会危及安全性或其他重要属性,则您需要采取一些不同的措施。在许多情况下,返回对象的新副本是更好的方法。
class Person {
private String[] hobbies;
String[] getHobbies(){ return hobbies;}
void setHobbies(String[] hobbies){ this.hobbies = hobbies;}
}
我知道一些解决办法:
- getHobbies(){return hobbies.clone();}
- 使用列表代替数组;
我想知道的是为什么只有array有这个bug,list没有这个问题?为什么数组与其他集合有如此大的不同?
Findbugs(现已被 Spotbugs 取代)提出了一个安全问题。它不是错误,因为它本身不会产生不需要的行为。但是这种内部数据的暴露可能会在以后的调用方方法中产生错误。
您猜对了,有两种方法可以保护您的 getter 免受暴露:
- Return 数组的副本
Arrays.copyOf(..)
- 用
Collections.unmodifiableList(..)
将其转换为 "Immutable" 列表(你也可以使用List.of(..)
因为 Java 9)
A List
将发出类似的警告,除非不可修改。
最好使用 Collections
而不是 Arrays
除非你真的有充分的理由不这样做。
在某些情况下,当您的写入很少而读取很多时,Class CopyOnWriteArrayList
是拥有简单的不可变列表 getter.
我想知道为什么数组会引发这个错误。
这只是一个警告。 Findbugs 在报告旁边显示严重性级别。
安全性中等曝光率,但错误率较低。
一个列表没有这个问题?
确实如此。 ArrayList 只是一个带有附加抽象层的数组。
为什么数组与其他集合如此不同?
数组是原生类型,而集合不是。
行为类似,但您对 Array 的控制不如对 Collection 的控制。
我的 POJO class 中的 byte[] 变量出现了这个问题。如果需要,可以使用注释来抑制它:@SuppressFBWarnings(value = {"EI_EXPOSE_REP", "EI_EXPOSE_REP2"})