2014-04-19 3 views
1

로컬로 정의 된 Hashtable에서 작업을 수행하는 동안 로컬 Hashtable에 할당 된 다른 클래스의 전역 Hashtable에도 이러한 작업이 수행됩니다. 이것이 분명해야 할 간단한 문제인지 잘 모르겠지만 그것에 대해 질문을 찾을 수는 없습니다.Java : 로컬 Hashtable 전역 Hashtable 덮어 쓰기

public void redraw(String[] sNewEntity,Hashtable<String,Entity> h){ 
    Hashtable<String,Entity> htEntities=h; 

    htEntities.remove(sNewEntity[0]); 
    //many lines of code that ensures that the removal doesn't invalidate anything 
    if(validation==true){ 
     m_HomeFrame.graph=new mxGraph(); 
     m_HomeFrame.myGraphComponent = new mxGraphComponent(m_HomeFrame.graph);   
     m_HomeFrame.setScroll(m_HomeFrame.myGraphComponent); 
     m_HomeFrame.m_Tree.h_entityTable=htEntities; 
    } 
} 

이것은 기능입니다. "m _"이있는 모든 변수는 전역 변수입니다. 이 메소드는 문자열 배열과 해시 테이블을 사용하고 문자열 배열의 첫 번째 항목의 키가있는 해시 테이블의 항목을 제거합니다. 문제는 글로벌 해시 테이블 (m_HomeFrame.m_Tree.h_entityTable)이 히트하자마자 업데이트된다는 것입니다 (htEntities.remove (sNewEntity [0]);). 전역 변수에서 htEntities를 분리하는 방법이 있습니까? 또한 Generics를 사용하지 않는 것에 대해 사과드립니다. 해시 테이블을 검색 할 때 꽤 자주 보았습니다.

+0

이런 종류의 동작을 부작용 *이라고합니다. – JonK

답변

4

h을 전달하면 실제 HashTable 개체가 전달되지 않습니다. HashTable 개체에 대한 참조를 전달 중입니다. 즉, h으로 변경하면 동일한 Object를 변경하게됩니다.

이 문제를 해결하는 방법은 new 키워드를 사용하는 것입니다. 그러면 Java 런타임을 으로 변경하여HashTable 오브젝트를 작성하십시오.

+0

Nevermind, 방금 Hashtable htEntities = 새로운 Hashtable (h); – Zipher200

+1

Hashtable htEntities = new Hashtable (); h에서 htEntities로 항목을 복사하려면 다음을 수행하십시오. htEntities.putAll (h); http://docs.oracle.com/javase/7/docs/api/java/util/Hashtable.html#putAll%28java.util.Map%29 –