从不同的类访问HashMap

时间:2015-03-22 18:02:46

标签: java hashmap

我的班级名为DataStorage:

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

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

如何在不同的类中访问此HashMap中的数据?

6 个答案:

答案 0 :(得分:8)

将HashMap创建为实例变量,并提供一种方法将其访问到您的类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 :(得分:3)

作为tell don't ask的倡导者,我想表明如何在没有吸气剂的情况下做到这一点。

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;            
        }  
    }
}

输出:

{bob=2, susan=5}

请注意DataStorage如何知道AnotherClass的存在? AnotherClass也不了解DataStorage。他们共享的只是一个界面。这意味着只要你继续支持该界面,你就可以自由地在任何一个班级做任何你喜欢的事。

顺便说一下,这些类只是静态的,因为我懒得将它们移动到自己的文件中。 :)

答案 2 :(得分:1)

您可以访问它:

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

答案 3 :(得分:1)

您可以将HashMap公开,也可以为其创建一个getter:

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

然后您可以使用DataStorage类的实例访问它,如下所示:

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

或者,如果你同时使getter和HashMap都是静态的:

DataStorage.getPeople()

编辑: 请注意,如果您的实例变量没有专门给出访问修饰符,则它们默认为package访问权限,这意味着可以从同一包中定义的其他类访问它们。有关访问修饰符的更多详细信息,请参阅documentation,这里有一个简短的摘要:

访问级别

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

答案 4 :(得分:0)

这是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;
            }
    }

从另一个类访问hashmap数据

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

答案 5 :(得分:0)

如果需要在整个应用程序中共享同一HashMap实例,则需要创建一个singleton。使用单例可以确保任何尝试访问它的实例都始终引用同一HashMap实例。例如HashMap<String,String>

单班:

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;
    }
}

在其他课程中的使用:

HashMap<String, String> referenceData = MyData.getInstance().referenceData;