2015-03-22 15 views
9

Mam HashMap w mojej klasie zatytułowanej DataStorage:Dostęp HashMap z innej klasy

HashMap<String, Integer> people = new HashMap<String, Integer>(); 

people.put("bob", 2); 
people.put("susan", 5); 

Jak mogę uzyskać dostęp do danych w tym HashMap w innej klasy?

+2

zdefiniować zmienną globalną jako statyczny, a następnie będzie można uzyskać do niego dostęp z różnych klas. 'public static HashMap people = new HashMap ();' –

Odpowiedz

6

Utwórz HashMap jako zmiennej instancji i przedstawienie sposobu, aby uzyskać do niego dostęp w swojej klasie API:

public class DataStorage { 
    private HashMap<String, Integer> people = new HashMap<String, Integer>(); 

    public HashMap<String, Integer> getPeopleMap() { 
     return people; 
    } 
} 

public class AnotherClass { 
     DataStorage x = new DataStorage();  

     private void someMethod() { 
      HashMap<String, Integer> people = x.getPeopleMap(); 
      //work with your map here... 
     } 
} 
1

Można do niego dostęp:

DataStorage storage = new DataStorage(); 
HashMap<String, Integer> people = storage.people; 
+0

I public. :) – CandiedOrange

+0

Albo ten sam pakiet;) –

1

Można też dokonać HashMap publicznej, lub utwórz dla niego getter:

public HashMap<String, Integer> getPeople() { 
    return people; 
} 

następnie można uzyskać do niego dostęp za pomocą instancji DataStor klasa wieku, podobnie jak to:

DataStorage dataStorage = new DataStorage(); 
dataStorage.getPeople() 

lub, jeśli również zrobić zarówno getter i HashMap statyczny:

DataStorage.getPeople() 

EDIT: Zauważ, że jeśli zmienne instancji nie są wyraźnie podane modyfikatory dostępu domyślnie mają one dostęp do package, co oznacza, że ​​można uzyskać do nich dostęp z innych klas zdefiniowanych w tym samym pakiecie. Więcej szczegółów na temat modyfikatorów dostępu można znaleźć w documentation, oto krótkie podsumowanie:

poziomów dostępu

Modifier Class Package Subclass World 
public   Y   Y  Y  Y 
protected  Y   Y  Y  N 
no modifier  Y   Y  N  N 
private   Y   N  N  N 
1

Jako zwolennik tell don't ask chciałbym pokazać, jak można to zrobić bez pobierające.

public class TellDontAsk { 

    interface MapSetter { 
     public void setMap(Map map); 
    } 

    interface MapGiver { 
     public void giveMap(MapSetter acceptMap); 
    } 

    public static void main(String[] args) { 
     HashMap<String, Integer> people = new HashMap<String, Integer>(); 

     people.put("bob", 2); 
     people.put("susan", 5); 

     DataStorage ds = new DataStorage(); 
     ds.setMap(people); 

     AnotherClass ac = new AnotherClass(); 
     ds.giveMap(ac); 

     ac.displayMap(); 
    } 

    public static class DataStorage implements MapSetter, MapGiver { 
     private Map map; 

     @Override 
     public void setMap(Map map) { 
      this.map = map;    
     } 

     @Override 
     public void giveMap(MapSetter acceptMap) { 
      acceptMap.setMap(map); 

     } 
    } 

    public static class AnotherClass implements MapSetter { 
     private Map map; 

     public void displayMap() { 
      System.out.println(map); 

     } 

     @Override 
     public void setMap(Map map) { 
      this.map = map;    
     } 
    } 
} 

Wyjścia:

{bob=2, susan=5} 

zauważyć jak DataStorage ma wiedza o AnotherClass s istnienia? Również AnotherClass nie ma informacji o DataStorage. Wszystko, co dzielą, to interfejs. Oznacza to, że możesz robić, co chcesz, w każdej z tych klas, o ile nadal będziesz wspierać ten interfejs.

BTW, klasy są tylko statyczne, ponieważ byłem leniwy, aby przenieść je do własnych plików. :)

+0

Zbyt wiele linii kodu dla zbyt małego efektu ... To super-interfejsowe kodowanie prowadzi do nieczytelnego kodu tylko do zapisu. – vojta

+1

@vojta jest w stanie traktować magazyn danych jako wtyczkę, nie jest to mały efekt. – CandiedOrange

0

To Eazy

public class ListDataStorage { 

      public static LinkedHashMap getHmapCashType(){ 

       LinkedHashMap<String, String> hMapCashType = new LinkedHashMap<String, String>(); 
       hMapCashType.put("A", "Cash"); 
       hMapCashType.put("B", "Credit"); 

       return hMapCashType; 
      } 
    } 

dane dostęp HashMap z innej klasy

String value = ListDataStorage.getHmapCashType().get("A").toString()