在将SonarQube版本4.3更新到5.6之后,我尝试将所有FindBugs规则迁移到Squid规则,因为FindBugs规则都被标记为已弃用。
但我对FindBugs规则EI_EXPOSE_REP有疑问:
返回对存储在对象的一个字段中的可变对象值的引用,公开该对象的内部表示。如果不受信任的代码访问实例,并且对可变对象的未经检查的更改会危及安全性或其他重要属性,则需要执行不同的操作。在许多情况下,返回对象的新副本是更好的方法。
我应该迁移到Squid规则S2384:
可变对象是那些状态可以改变的对象。例如,数组是可变的,但String不是。永远不应将可变类成员返回给调用者或直接接受和存储。这样做会使您容易受到类状态的意外更改。
而是使用不可修改的
Collection
(通过Collections.unmodifiableCollection
,Collections.unmodifiableList
,...)或制作可变对象的副本,然后存储或返回副本。此规则检查数组,集合和日期是否未直接存储或返回。
关注SonarQube Java Plugin coverage/deprecation of FindBugs:
EI_EXPOSE_REP S2384不应直接存储或返回可变成员 EI_EXPOSE_REP2 S2384不应直接存储或返回可变成员 EI_EXPOSE_STATIC_REP2 S2384不应直接存储或返回可变成员
使用Squid规则,类型为Collection
的代码会遇到很多问题:
public class MyClass {
private List<String> assetIds;
public List<String> getAssetIds() {
return assetIds;
}
public void setAssetIds(List<String> assetIds) {
this.assetIds = assetIds;
}
}
使用FindBugs规则EI_EXPOSE_REP我没有遇到此问题。它只检查Date
和数组。这是FindBugs的错误吗?
有没有办法摆脱Collection
类型的所有问题而不更改我的遗留代码,但仍然会看到Date
和数组的问题?