如何在java中对arrylist执行深度复制

如何在java中对arrylist执行深度复制,java,Java,我有一个成员变量 private ArrayList<CalendarableItem>[] resourceColumns = null; private ArrayList[]resourceColumns=null; 和getter一样 public ArrayList<CalendarableItem>[] getResourceColumns() { return resourceColumns; } public ArrayList[]getR

我有一个成员变量

private ArrayList<CalendarableItem>[] resourceColumns = null;
private ArrayList[]resourceColumns=null;
和getter一样

 public ArrayList<CalendarableItem>[] getResourceColumns()
{
    return resourceColumns;
}
public ArrayList[]getResourceColumns()
{
返回资源列;
}
我看到了上述getter方法的findbugs。 恶意代码漏洞:EI:返回数组的方法可能会暴露内部表示

我发现我必须对array对象进行深度复制才能删除此错误


由于性能问题,我不想克隆此对象。我们还有其他更好的解决方案吗。

如果希望列表在深度上不可变,请删除getter。这个返回列表的getter提供了删除、添加。。。里面有什么东西吗

相反,您可以使用类似于适配器的东西来授予所需的访问权限。类似于特定的getter或列表的大小,但不允许访问列表

private List<CalendarableItem> resourceColumns = new ArrayList<>();

public CalendarableItem getCalendarableItem(int index){
     return resourceColumns.get(index);
}

public int getSize(){ return resourceColumns.size(); }
私有列表resourceColumns=new ArrayList();
公共CalendarableItem getCalendarableItem(int索引){
返回resourceColumns.get(索引);
}
public int getSize(){return resourceColumns.size();}
您的列表将是一个不可变的(暂时)。唯一可能的途径是你在课堂上适应的

如果要阻止更新实例,也可以返回它的副本,因为目前实例返回的是列表中的一个(相同的引用)


编辑:我刚刚注意到这是ArrayList的一个数组,所以这个例子不是很像这样的函数,它是为一个简单的ArrayList编写的。您需要根据需要更新适配器。

只是一个建议,而不是使用
ArrayList[]
您应该
使用列表

现在回到您的问题,您可以返回阵列的克隆,以便在任何人对阵列进行任何更改时,它都不会反映在初始阵列中

public ArrayList<CalendarableItem>[] getResourceColumns()
{
    return Arrays.copyOf(resourceColumns, resourceColumns.length);
}
public ArrayList[]getResourceColumns()
{
返回Arrays.copyOf(resourceColumns,resourceColumns.length);
}

如果您想要/需要更多的控制,则需要在特定的数组索引等处编写单独的方法返回对象,而不是方法
getResourceColumns()。你应该考虑使用<代码>列表>代码>。他的话是:由于性能问题,我不想做这个对象的克隆,这不会执行深度拷贝,只有一个拷贝数组和列表的副本是可变对象,因此他至少需要克隆数组。ArrayList对象将保持原样。所以克隆数组不会消耗太多内存,当然这也取决于数组的长度。但是复制的数组仍然包含相同的引用(也称为相同的列表),所以他的测试仍然会返回方法。我认为返回数组可能会暴露内部表示。是的,您将阻止开发人员删除或覆盖阵列中的实例,但您仍将返回列表,以便您可以在需要时清空它。我相信OP想阻止这一切,因为他说的是深度复制