Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从其他类访问HashMap_Java_Hashmap - Fatal编程技术网

Java 从其他类访问HashMap

Java 从其他类访问HashMap,java,hashmap,Java,Hashmap,我的类中有一个名为DataStorage的hashmap: HashMap<String, Integer> people = new HashMap<String, Integer>(); people.put("bob", 2); people.put("susan", 5); HashMap people=newhashmap(); 人。把(“鲍勃”,2); 人。把(“苏珊”,5); 如何在其他类中访问此HashMap中的数据?您可以访问它: DataStor

我的类中有一个名为DataStorage的hashmap:

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

people.put("bob", 2);
people.put("susan", 5);
HashMap people=newhashmap();
人。把(“鲍勃”,2);
人。把(“苏珊”,5);
如何在其他类中访问此HashMap中的数据?

您可以访问它:

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

创建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...
      }  
}
公共类数据存储{
private HashMap people=new HashMap();
公共HashMap getPeopleMap(){
还人,;
}
}
公共类另一类{
DataStorage x=新的DataStorage();
私有方法(){
HashMap people=x.getPeopleMap();
//在这里使用你的地图。。。
}  
}

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

public HashMap<String, Integer> getPeople() {
    return people;
}
或者,如果还使getter和HashMap都是静态的:

DataStorage.getPeople()
编辑: 注意,如果您的实例变量没有特别指定访问修饰符,那么它们默认为
package
access,这意味着可以从同一个包中定义的其他类访问它们。有关访问修饰符的更多详细信息,请参阅,以下是一个简要摘要:

访问级别

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
作为一个项目的倡导者,我想展示一下如何在没有任何获得者的情况下做到这一点

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;            
        }  
    }
}
请注意,
DataStorage
如何不知道另一个类的存在?
另一个类也不知道
数据存储
。它们共享的只是一个接口。这意味着您可以在任何一个类中自由地执行任何您喜欢的操作,只要您继续支持该接口


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

这是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实例,则需要创建一个。使用单例可以保证HashMap的同一个实例总是被试图访问它的任何人引用。例如,对于
HashMap

单例类:

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;
公共类MyData{
私有静态最终MyData实例=新MyData();
私有MyData(){
HashMap myDataMap=新HashMap();
…填充地图的逻辑
this.referenceData=myDataMap;
}
公共哈希映射引用数据;
公共静态设备数据getInstance(){
返回实例;
}
}
在其他类中的用法:

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;
HashMap referenceData=MyData.getInstance().referenceData;

将其定义为静态全局变量,然后您可以从不同的类访问它<代码>公共静态HashMap people=newhashmap()代码行太多,效果太小。。。这种超级接口编码会导致无法读取、只能写的代码。@vojta能够将数据存储作为插件来处理,这不是一个小效果。本文声明不要使用singleton:到目前为止,这是访问整个项目中hashmap的最简单的方法。谢谢,有没有一种方法可以同时从另一个类设置hashmap,而不用在数据存储中公开用户?
HashMap<String, String> referenceData = MyData.getInstance().referenceData;