2013-11-04 31 views
0

我需要知道如何通過Hashtable循環,檢查每個值的可克隆性,並在可能的情況下克隆。此Hashtable具有所有的String鍵,但值可以是任何類。我在另一個堆棧溢出頁面中遇到了以下Hashmap示例,但我需要使用Hashtable來完成此操作。更具體地說,一個沒有括號。 (Hashtable而不是Hashtable<Type, Type>。)我也看到了循環ArrayList和克隆每個元素的示例,但我需要使用散列表來完成此操作。我發佈了兩段代碼:第一個是我發現的HashMap示例,第二個是我當前的提案以及我遇到的問題。如何遍歷Map並複製每個值?

HashMap中

public Map<String,C> deepCopy(Map<String, C> original) { 
    Map<String, C> copy = new HashMap<String, C>(original.size()); 
    for(Map.Entry<String, C> entry : original.entries()) { 
     copy.put(entry.getKey(), entry.getValue().clone()); 
    } 
} 

我的建議

public class _HashtableCloningTest { 
    public Hashtable deepClone(Hashtable original) { 
     Hashtable newH = new Hashtable(original.size()) 
     Set<String> keys = original.keySet(); 
      for (String key : keys) 
       if (original.get(key) instanceof Cloneable) 
        newH.put(key, original.get(key).clone()); 
     return newH; 
    } 
} 

該代碼將無法編譯。錯誤表示克隆方法在對象類上,並且該類上的方法受到保護。我需要它克隆當前值的類,但是因爲我作爲程序員不知道那個類,所以我不知道如何將它轉換爲合適的類。

任何有關這一障礙的見解和幫助將不勝感激。

+1

你爲什麼要克隆任意對象?這通常是一種代碼味道,即IME。 –

+0

這是我的客戶想要完成的方式。我意識到可能有更好的方法,但我需要知道如何做到這一點。我被告知這是可能的,即使不是最好的解決方案。 – user1567060

+0

您的代碼存在的問題是,Cloneable很難正確實施,所以對於很多人來說,這不是克隆你所反對的可靠方法。閱讀http://stackoverflow.com/questions/4081858/about-java-cloneable解決你的問題,你需要知道放在什麼樣的情況下,在這個地圖並正確投放。 –

回答

1

clone()方法受到嚴格保護,以防止克隆任意對象,這通常表明您正在嘗試執行某些奇怪的操作。

Cloneable不包含clone()有點不方便。請參閱Why is the clone() method protected in java.lang.Object?的答案,就此事進行一些討論。

另請參閱https://stackoverflow.com/a/10083129/616460的答案,以獲得關於clone()一般問題的幾個好指針。

在任何情況下,如果你有做到這一點...

一種選項可定義標記對象爲能夠被複制你的哈希表的接口,並且還提供clone(),如:

public interface Copiable extends Cloneable { 
    public Object clone(); 
} 

第二個選擇是創建一些接口,提供了一種方法,使一個對象的深層副本,和你的類實現的是,如:

public interface Copiable { 
    public Copiable createDeepCopy(); 
} 

如果您絕望,還有另一種選擇是使用反射來調用Cloneable對象上的clone()。不過,你可能想三思而後行。