2017-01-12 13 views
0

上arrylist進行深拷貝有相同我如何在Java

public ArrayList<CalendarableItem>[] getResourceColumns() 
{ 
    return resourceColumns; 
} 

我看到上面getter方法FindBugs的變量

private ArrayList<CalendarableItem>[] resourceColumns = null; 

成員和getter。 惡意代碼漏洞:EI:方法返回陣列可能會暴露內部表示

我發現,我所要做的數組對象的深副本消除這種誤差Malicious code vulnerability - May expose internal representation by incorporating reference to mutable object

我不想做這個對象,由於克隆性能問題。我們有沒有其他更好的解決方案?

+1

注意,數組和泛型是不安同牀異夢返回對象。你應該考慮使用'List >'代替。 –

回答

0

如果您希望列表的深度不可變,請刪除getter。這個getter返回列表給出了刪除,添加,...任何項目的可能性。

你可以改用類似於適配器的東西來給你想要的訪問權限。就像一個特定的getter或列表的大小,但沒有給列表的訪問權限。

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

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

public int getSize(){ return resourceColumns.size(); } 

您的列表將是私人的不可變的(目前)。唯一可能的訪問是你在課堂上適應的。

如果您想防止實例更新,您也可以返回它的副本,因爲目前實例返回是列表中的一個(同一個參考)。

編輯:我剛剛注意到,這是一個ArrayList數組,因此這個例子不像這樣的函數,它是爲一個簡單的ArrayList編寫的。您需要根據需要更新適配器。

0

只是一個建議,而不是使用ArrayList<CalendarableItem>[]你應該use List<List<CalendarableItem>>

現在回到你的問題,你可以返回數組的克隆,這樣的情況下,任何一個使您最初的數組中不會反映任何改變陣列。

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

如果你想/需要更多的控制,然後,而不是方法getResourceColumns()你需要編寫不同的方法,在特定的數組索引等

+0

這些是他的話:_我不想克隆這個對象由於性能issue_這不會執行深層複製,只有集合副本 – AxelH

+0

陣列和列表是可變對象,因此他至少需要克隆數組。 ArrayList對象將按原樣。所以克隆陣列當然不會吃太多的內存,這也取決於數組的長度。 –

+0

但是您的複製數組仍將包含相同的引用(又名相同的列表),所以他的測試仍然會返回_Method返回數組可能會暴露**內部表示** _我想。是的,您會阻止開發人員刪除或重寫數組中的實例,但您仍然會返回該列表,以便您可以根據需要將其清空。我相信OP想要防止這種情況,因爲他談論的是深層複製 – AxelH