Spotbugs raises a warning EI_EXPOSE_REP (May expose internal representation by returning reference to mutable object) for the following code:
public record Example(
List<String> ex) {
public Example {
ex = List.copyOf(new ArrayList<>(ex));
}
}
In FindBugs raises a bug called EI_EXPOSE_REP caused by Array something like that is proposed as a solution. But it does not seem to work anymore. Any hints how to resolve that? Is that a bug in Spotbugs? If there is no other way then to suppress it: Is it possible to suppress in on field level instead of on class level?
At the end I will need a solution which also works in a Null - Safe manner. For that I introduced an own copyOf
method. Would be great if the solution at the ends work in that null safe manner. (But the Spotbugs warning appears independently if I use my own copyOf
method, or the one in 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));
}
Does not work with copyOf
and also not with unmodifiableList
.
Apart from making an immutable copy of the list in the constructor, you also need to update its getter.
public List<String> ex() {
return Collections.unmodifiableList(ex);
}