J'ai une table de hachage dans ma classe intitulée DataStorage:
HashMap<String, Integer> people = new HashMap<String, Integer>();
people.put("bob", 2);
people.put("susan", 5);
Comment puis-je accéder aux données de ce HashMap dans une classe différente?
Créez votre HashMap en tant que variable d'instance et fournissez une méthode pour y accéder dans votre API de classe:
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...
}
}
En tant que défenseur de dites, ne demandez pas je voudrais montrer comment cela peut être fait sans aucun accesseur.
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;
}
}
}
Les sorties:
{bob=2, susan=5}
Remarquez comment DataStorage
n'a aucune connaissance de AnotherClass
s? AnotherClass
n'est pas non plus au courant de DataStorage
. Tout ce qu'ils partagent, c'est une interface. Cela signifie que vous êtes libre de faire ce que vous voulez dans l'une ou l'autre classe tant que vous continuez à supporter cette interface.
Au fait, les classes ne sont statiques que parce que j'étais trop paresseux pour les déplacer dans leurs propres fichiers. :)
Vous pouvez y accéder:
DataStorage storage = new DataStorage();
HashMap<String, Integer> people = storage.people;
Vous pouvez soit rendre votre HashMap public, soit créer un getter pour celui-ci:
public HashMap<String, Integer> getPeople() {
return people;
}
alors vous pouvez y accéder en utilisant une instance de la classe DataStorage, comme ceci:
DataStorage dataStorage = new DataStorage();
dataStorage.getPeople()
ou, si vous créez également le getter et le HashMap static:
DataStorage.getPeople()
EDIT: Notez que si vos variables d’instance ne sont pas spécifiquement attribuées à des modificateurs d’accès, leur valeur par défaut est package
access, ce qui signifie qu’elles peuvent être accessibles à partir d’autres classes définies dans le même package. Plus de détails sur les modificateurs d'accès peuvent être trouvés dans la documentation
, voici un bref résumé:
Niveaux d'accès
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
Ceci est facile
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;
}
}
accéder aux données de hashmap d'une autre classe
String value = ListDataStorage.getHmapCashType().get("A").toString()
Si vous avez besoin de partager la même instance d'un HashMap dans votre application, vous devez créer un singleton . L'utilisation d'un singleton garantit que toute tentative d'accès à la même instance de HashMap sera toujours référencée. Par exemple pour un HashMap<String,String>
:
Classe Singleton:
public class MyData {
private static final MyData instance = new MyData ();
private MyData () {
HashMap myDataMap = new HashMap<String, String>();
... logic to populate the map
this.referenceData = myDataMap;
}
public HashMap<Integer, DeviceReference> referenceData;
public static DeviceData getInstance(){
return instance;
}
}
Utilisation dans une autre classe:
HashMap<String, String> referenceData = MyData.getInstance().referenceData;