当前位置: 首页 > 知识库问答 >
问题:

(Java参考情况)我应该按照findbugs工具的要求去做吗?

唐经国
2023-03-14

我在我的项目上运行了Findbug工具,它发现了18个此类问题:

存储对可变对象的引用-

所以我有一个类,构造函数接受Object类型的数组,并将其分配给一个私有类成员变量。下面是一个例子:

public Class HtmlCellsProcessing extends HtmlTableProcessing
{
    private Object[] htmlCells;

    public HtmlCellsProcessing(Object[] htmlCells)
    {
        this.htmlCells = htmlCells;
    }
}

以下是关于警告的进一步解释:

此代码将对外部可变对象的引用存储到对象的内部表示中。

他们给我的建议非常明显,但如果数组的大小非常大,如果我将其值复制到成员变量数组中,应用程序将占用两倍的内存,会发生什么。

在我拥有大量数据的情况下,我应该怎么做?我应该把它作为参考还是一直复制?

共有3个答案

长孙兴德
2023-03-14

如果同时需要封装和性能,典型的解决方案是将引用传递给不可变对象。

因此,与其直接传递一个巨大的数组,不如将其封装在一个不允许数组修改的对象中:

final class ArraySnapshot {
    final Object[] array;

    ArraySnapshot(Object[] array) {
        this.array = Arrays.copyOf(array);
    }

    // methods to read from the array
}

这个对象现在可以廉价地传递,但是由于它是不可变的,封装是可以确保的。

当然,这个想法并不新鲜:这就是Stringchar[]所做的。

姬成荫
2023-03-14

我想让你试试使用番石榴库中的不可变列表。看http://code.google.com/p/guava-libraries/wiki/ImmutableCollectionsExplained

微生嘉祥
2023-03-14

视情况而定。你有多种顾虑,包括空间、时间和正确性。

防御副本可以帮助您保证列表项不会在持有数组的类不知道的情况下更改。但是这需要O(n)时间和空间。

对于非常大的阵列,您可能会发现防御拷贝在空间和时间上的成本对应用程序有害。如果通过访问数组来控制所有代码,那么在没有防御副本的情况下保证正确性,并抑制该类上的FindBugs警告可能是合理的。

 类似资料:
  • 1. gdb 调试利器 2. ldd 查看程序依赖库 3. lsof 一切皆文件 4. ps 进程查看器 5. pstack 跟踪进程栈 6. strace 跟踪进程中的系统调用 7. ipcs 查询进程间通信状态 8. top linux下的任务管理器 9. free 查询可用内存 10. vmstat 监视内存使用情况 11. iostat 监视I/O子系统 12. sar 找出系统瓶颈的利器

  • 这个程序应该接受一个字符串,检查每个字母是否是一个元音,并将元音变成下划线。例如,如果我输入< code>some,它应该输出< code>s_m_。这是一个简单的编程练习,我觉得我应该能够做到。然而,我真的被难住了,不知道我做错了什么。 我声明了一个保留元音的数组,一个包含更新字符串的变量,我循环遍历字符串,使用比较每个字母,以检查它是否在数组中。如果是,我会在更新的字符串中添加,如果不是,我会

  • 我是使用SiteMinder的新手,我想知道所有我需要阅读和理解的东西才能使用它。请相称好的参考资料。谢谢。

  • 手机轻推-轻应用-考勤打卡(如果没有点击“添加”) 备注:目前考勤打卡轻应用只能在手机上操作和管理

  • 就像其他地方已经提到的,Sphinx不是个名叫“sphinx”的单独可执行程序,而是由四个独立的程序共同组成的。本节介绍这些工具和他们的用法。

  • 我创建了重置密码页面,用过的输入他的电子邮件,PHP给他发回重置密钥。邮件可以工作,但在我的gmail帐户中它是纯文本的。我希望它以超文本标记语言出现。