2013-03-19 48 views
0

我想知道我怎么能在以下情况下产生我的数组的一个副本:Java返回一个ArrayList的克隆包裹在collections.synchronizedlist

private List<TestObject> testList = Collections.synchronizedList(new ArrayList<TestObject>()); 

....

public synchronized List<TestObject> getAllTestObjects(){ 
    return testList.clone(); 
    //I have tried casting to List<TestObject> 
} 

对于List没有定义clone(),这是呻吟。但我不确定如何最好地解决它?

任何帮助将不胜感激。

回答

2

您需要使用ArrayList

public synchronized List<TestObject> getAllTestObjects(){ 
    return new ArrayList<TestObject>(testList);   
} 
+0

是synchronized'这里需要'? – ataulm 2013-08-02 15:41:13

+1

是的,因为复制构造函数在给定列表上运行一个循环。看到我的相关答案[这里](http://stackoverflow.com/a/17616858/2071828) - 这是一个“集合”,但同样的逻辑成立。 – 2013-08-02 15:43:05

+0

复制列表时,是否可以安全地同步方法执行? AFAIK,你应该在testList本身上进行同步。 – 2015-12-14 09:40:46

0

提供的构造这应该工作:

private static class TestObject { 
} 
private TestObject[] objects = new TestObject[10]; 
private List<TestObject> testList = 
    Collections.synchronizedList(new ArrayList<TestObject>(Arrays.asList(objects)));