声纳扫描 - 不应直接存储或返回可变成员

时间:2016-12-15 16:46:19

标签: java sonarqube clone mutable

当我进行声纳扫描时,我得到了漏洞“不应该存储或直接返回可变成员”。如果提到我们应该克隆可变对象或返回不可修改的列表,也会提供此解决方案。 但是,如果我克隆该对象,如果我想更新该值,那么如何才能访问原始对象,因为我已经返回了克隆对象? 对此的任何想法将不胜感激。提前致谢

1 个答案:

答案 0 :(得分:3)

  

但是,如果我克隆该对象,稍后如果我想更新该值,那么我如何访问原始对象,因为我已经返回了克隆对象

你不是。至少不是来自来电者。

我会在这里说谎,并说我们正在谈论一个清单,所以:

public class MyClass {
  private List<String> strings;

  public List<String> getStrings(){ 
    // returns a copy, so member list is still intact
    return new ArrayList<String>(strings);
  }

  public void addString(String newString) {
    strings.add(newString);
  }

  public void dropString(String oldString) {
    strings.remove(oldString);
  }

  public void replaceString(String oldString, String newString) {
    dropString(oldString);
    addString(newString);
  }
}

换句话说,您可以通过拥有类控制对成员操作的访问。如果你真的想要一个任何人都可以获得和更新的公共成员(不是我推荐的那样),那么就放弃getter并使成员成为public