web-dev-qa-db-fra.com

Accéder à une table de hachage à partir d'une classe différente

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?

10
Mr.Smithyyy

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...
      }  
}
8
vojta

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 AnotherClasss? 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. :)

3
candied_orange

Vous pouvez y accéder:

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

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
1
AtomHeartFather

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()
0
Tharindu Bandara

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;
0
Chris Halcrow