【问题标题】:How to Fix FindBug error 'May expose internal representation by incorporating reference to mutable object' while setting Array of Objects? [duplicate]如何在设置对象数组时修复 FindBug 错误“可能通过合并对可变对象的引用来暴露内部表示”? [复制]
【发布时间】:2015-11-16 16:42:35
【问题描述】:

我有一个方法,它将对象数组作为输入并将其存储在实例变量中。这是执行此操作的代码,但 FindBugs 报告了一个错误,提示“可能通过合并对可变对象的引用来暴露内部表示”。

public final class HelloWorld
{
    public final Hello objs[];

    public HelloWorld(Hello[] inputs)
   {
        this.objs = inputs;
   }

}

我尝试使用 Arrays.copyOf,但仍然出现此错误。

this.objs = Arrays.copyOf(inputs,inputs.length);

我该如何解决这个 FindBugs 问题?

【问题讨论】:

  • 如前所述,当有人构造了 Helloworld 对象后,他们可以更改输入的内容(他们的变量),这将更改 Helloworld 的版本。

标签: java arrays findbugs


【解决方案1】:

您应该将您的会员更改为私人会员:

private final Hello objs[];

虽然将成员声明为 final 会阻止它在首次初始化后被分配,但它不会阻止通过简单地编写来分配其各个条目:

Hello[] harr = {new Hello(), new Hello()};
HelloWorld hw = new HelloWorld(harr);
hw.objs[1] = new Hello(); // this would mutate the contents of your array member

【讨论】:

  • 但是访问修饰符的更改将如何解决这个问题?
  • @yathirigan 您将无法从班级外部访问数组成员。 (即我的代码 sn-p 中的第 3 行不会通过编译)
  • 知道了,但是在将其设为私有后,我应该仍然使用 Arrays.copyOf 还是只执行 objs = inputs ? ,对于这个实例变量,我确实有一个 getter 方法( getObjs() )。我应该使用 objs.clone() 在 getter 方法中返回值吗?
  • @yathirigan 你仍然应该使用Arrays.copyOf。否则,在我的示例中,您将能够通过harr[i]=... 改变成员数组。在您的 getter 中返回数组的副本可能也是一个好主意(假设您不希望该方法的调用者能够改变您的成员数组)。
猜你喜欢
  • 2013-09-28
  • 2012-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多