2013-11-04 7 views
0

Hashtable을 통해 for 루프를 수행하고 각 값에 대해 복제 가능성을 확인하고 가능한 경우 복제하는 방법을 알아야합니다. 이 Hashtable에는 모든 String 키가 있지만 값은 모든 클래스가 될 수 있습니다. 다른 스택 오버플로 페이지에서 다음 Hashmap 예제를 보았습니다.하지만이 작업은 Hashtable로 수행해야합니다. 보다 구체적으로, 괄호가없는 것. (Hashtable<Type, Type> 대신 Hashtable.) 또한 ArrayList를 반복하고 각 요소를 복제하는 예제를 보았습니다. 그러나 해시 테이블을 사용하여이 작업을 수행해야합니다. 아래 두 개의 코드를 게시했습니다. 첫 번째는 찾은 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; 
    } 
} 

이 코드는 컴파일되지 않습니다. 이 오류는 clone 메서드가 개체 클래스에 있고 해당 클래스의 메서드가 보호되어 있다고 말합니다. 나는 현재 값의 클래스를 복제 할 필요가 있지만 프로그래머는 클래스를 모르기 때문에 적절한 클래스로 캐스팅하는 방법을 모른다.

이 장애물에 대한 통찰력과 도움을 주시면 대단히 감사하겠습니다.

+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?을 참조하십시오.

일반적으로 clone() 문제에 대한 몇 가지 유용한 정보는 https://stackoverflow.com/a/10083129/616460의 답변도 참조하십시오. 어떤 경우

, 당신은이 작업을 수행하는이 경우 ...

clone()을 제공하여 해시 테이블 복사 할 수있는 물체를 표시하는 인터페이스를 정의하고 있습니다 하나 개의 옵션, 예를 들어, :

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

두 번째 옵션은 객체의 전체 복사본을 만들 수있는 방법을 제공하는 몇 가지 인터페이스를 만들고, 클래스가 구현하는 것입니다 예 :

public interface Copiable { 
    public Copiable createDeepCopy(); 
} 

또 다른 옵션은 리플렉션을 사용하여 Cloneable 개체에서 clone()을 호출하는 것입니다. 그래도 자신이하는 일에 대해 두 번 생각할 수도 있습니다.

관련 문제