如何解决列表记录中的EI_EXPOSE_REP

How to solve EI_EXPOSE_REP in records for Lists

提问人:lsteffen 提问时间:10/25/2023 最后编辑:Abralsteffen 更新时间:11/10/2023 访问量:69

问:

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 方式工作。为此,我引入了一种自己的方法。如果末端的解决方案以这种空安全方式工作,那就太好了。(但是,如果我使用自己的方法,或者copyOfcopyOfjava.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));
}

不适用于,也不适用于 。copyOfunmodifiableList

爪哇岛 列表 斑点虫 java-记录

评论


答:

0赞 Adam Dąbrowski 11/10/2023 #1

除了在构造函数中创建列表的不可变副本外,您还需要更新其 getter。

public List<String> ex() {
    return Collections.unmodifiableList(ex);
}

评论

0赞 lsteffen 11/21/2023
嗨,亚当,非常感谢四你的回答。我试过了,斑点错误警告消失了。但我仍然有点失望,因为这是不必要的复制,只是为了满足斑点错误。实际上并不需要它,因为列表之前已经是不可变的,因此在调用 getter 后无法更改。