提问人:lsteffen 提问时间:10/25/2023 最后编辑:Abralsteffen 更新时间:11/10/2023 访问量:69
如何解决列表记录中的EI_EXPOSE_REP
How to solve EI_EXPOSE_REP in records for Lists
问:
Spotbugs 为以下代码引发警告EI_EXPOSE_REP(可能通过返回对可变对象的引用来公开内部表示):
public record Example(
List<String> ex) {
public Example {
ex = List.copyOf(new ArrayList<>(ex));
}
}
在 FindBugs 中,引发了一个名为 EI_EXPOSE_REP 的 bug,该 bug 是由 Array 引起的,因此提出了类似的解决方案。但它似乎不再起作用了。有什么提示如何解决这个问题吗?这是 Spotbugs 中的错误吗?如果没有其他方法可以压制它:是否有可能在领域层面而不是在阶级层面上压制?
最后,我需要一个解决方案,该解决方案也以 Null - Safe 方式工作。为此,我引入了一种自己的方法。如果末端的解决方案以这种空安全方式工作,那就太好了。(但是,如果我使用自己的方法,或者copyOf
copyOf
java.util.List
)
public static <T> List<T> copyOf(List<T> listToCopy) {
if (listToCopy == null) {
return Collections.emptyList();
}
//noinspection Java9CollectionFactory: cannot be replaced as List.copyOf is not null safe.
return Collections.unmodifiableList(new ArrayList<>(listToCopy));
}
不适用于,也不适用于 。copyOf
unmodifiableList
答:
0赞
Adam Dąbrowski
11/10/2023
#1
除了在构造函数中创建列表的不可变副本外,您还需要更新其 getter。
public List<String> ex() {
return Collections.unmodifiableList(ex);
}
评论
0赞
lsteffen
11/21/2023
嗨,亚当,非常感谢四你的回答。我试过了,斑点错误警告消失了。但我仍然有点失望,因为这是不必要的复制,只是为了满足斑点错误。实际上并不需要它,因为列表之前已经是不可变的,因此在调用 getter 后无法更改。
评论