从不同的 class 访问 HashMap
Accessing a HashMap from a different class
我的 class 中有一个名为 DataStorage 的散列表:
HashMap<String, Integer> people = new HashMap<String, Integer>();
people.put("bob", 2);
people.put("susan", 5);
如何在不同的 class 中访问此 HashMap 中的数据?
您可以访问它:
DataStorage storage = new DataStorage();
HashMap<String, Integer> people = storage.people;
将您的 HashMap 创建为实例变量,并提供一种方法将其访问到您的 class 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...
}
}
您可以制作 HashMap public,或为其创建 getter:
public HashMap<String, Integer> getPeople() {
return people;
}
然后您可以使用 DataStorage class 的实例访问它,如下所示:
DataStorage dataStorage = new DataStorage();
dataStorage.getPeople()
或者,如果您也将 getter 和 HashMap 设为静态:
DataStorage.getPeople()
编辑:
请注意,如果您的实例变量没有特别指定访问修饰符,它们默认为 package
访问,这意味着它们可以从同一包中定义的其他 classes 访问。有关访问修饰符的更多详细信息可以在 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
作为 tell don't ask 的拥护者,我想展示如何在没有任何 getter 的情况下完成此操作。
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
。他们所共享的只是一个界面。这意味着只要您继续支持该界面,您就可以在 class 中自由地做任何您想做的事。
顺便说一句,classes 只是静态的,因为我懒得将它们移动到自己的文件中。 :)
这很简单
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;
}
}
从另一个 class
访问 hashmap 数据
String value = ListDataStorage.getHmapCashType().get("A").toString()
如果您需要在整个应用程序中共享 同一个 HashMap 实例,则需要创建一个 singleton。使用单例可保证 HashMap 的同一实例将始终被任何试图访问它的对象引用。例如 HashMap<String,String>
:
单例class:
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;
}
}
另一个用法class:
HashMap<String, String> referenceData = MyData.getInstance().referenceData;
我的 class 中有一个名为 DataStorage 的散列表:
HashMap<String, Integer> people = new HashMap<String, Integer>();
people.put("bob", 2);
people.put("susan", 5);
如何在不同的 class 中访问此 HashMap 中的数据?
您可以访问它:
DataStorage storage = new DataStorage();
HashMap<String, Integer> people = storage.people;
将您的 HashMap 创建为实例变量,并提供一种方法将其访问到您的 class 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...
}
}
您可以制作 HashMap public,或为其创建 getter:
public HashMap<String, Integer> getPeople() {
return people;
}
然后您可以使用 DataStorage class 的实例访问它,如下所示:
DataStorage dataStorage = new DataStorage();
dataStorage.getPeople()
或者,如果您也将 getter 和 HashMap 设为静态:
DataStorage.getPeople()
编辑:
请注意,如果您的实例变量没有特别指定访问修饰符,它们默认为 package
访问,这意味着它们可以从同一包中定义的其他 classes 访问。有关访问修饰符的更多详细信息可以在 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
作为 tell don't ask 的拥护者,我想展示如何在没有任何 getter 的情况下完成此操作。
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
。他们所共享的只是一个界面。这意味着只要您继续支持该界面,您就可以在 class 中自由地做任何您想做的事。
顺便说一句,classes 只是静态的,因为我懒得将它们移动到自己的文件中。 :)
这很简单
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;
}
}
从另一个 class
访问 hashmap 数据String value = ListDataStorage.getHmapCashType().get("A").toString()
如果您需要在整个应用程序中共享 同一个 HashMap 实例,则需要创建一个 singleton。使用单例可保证 HashMap 的同一实例将始终被任何试图访问它的对象引用。例如 HashMap<String,String>
:
单例class:
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;
}
}
另一个用法class:
HashMap<String, String> referenceData = MyData.getInstance().referenceData;