基本上我要做的就是在一个类中创建一个HashMap对象,使用循环在该类中构建它,然后能够将其调用到另一个类中。我不确定要完成此操作需要做什么。我尝试在类本身中声明它,然后在main()函数中构建它,但这不允许我在类外部访问它,因为它必须是静态的。
以下是我思考过程的一些伪代码:
public class Class1 {
public Map<> map = new HashMap<>();
public static void main(String[] args) {
//build hashmap here using map.put etc
}
public class Class2 {
public static void main(String[] args) {
//get the map using Class1.map
}
}
答案 0 :(得分:2)
HashMap
是一个对象。因此,在另一个类的对象的方法调用中传递对它的引用。
制作地图。
Map map = new HashMap() ;
map.put( … ) ;
制作另一个对象。在这里,我们假设您编写了一个名为Other
的类。
Other other = new Other() ;
通过地图。
other.workOnMap( map ) ;
您可以在Oracle Java Tutorials中看到这一点。
这是一个使用四个类的完整示例,您可以编写自己的MapDemo.java
和ReportTool.java
以及LoggingTool.java
和EmployeePagingTool.java
。
在public static void main
方法中,我们创建了一个应用程序实例来开始。这解决了chicken-or-the-egg paradox的OOP。在学习Java时,不要专注于这种方法。我将其更多地看作是黑客,是将我们从地球(主机,操作系统,文件,内存尚未分配)带到天堂的一个拐杖(一个奇妙的OOP天堂,只有干净的物体在周围漂浮,并相互传递消息) )。
真正的行动是在doIt
方法中,我们建立Map
的DayOfWeek
枚举对象,这些对象导致一个String
包含员工姓名的雇员,该雇员的姓名涵盖了一天(例如进行呼叫寻呼机)。
enum
表示已经为我们实例化的一组命名对象。在这种情况下,我们已经为我们创建了七个DayOfWeek
对象,一周中的每一天都有一个。这里没有什么太神秘的,枚举对象只是一个对象,而是JVM加载类时已经提前为您调用new DayOfWeek
的对象。
我们以一周中的每一天为关键字填充地图,每个DayOfWeek
关键字对象都指向某人的名字。我们为一周中的每一天分配了一个唯一的名称。
最后,我们将此地图移交给另一个对象进行分析,以生成报告并发送给老板。我们从类ReportTool
实例化的其他工具(此处未显示,因为其源代码与该演示无关)。 LoggingTool
和EmployeePagingTool
的同上。
package com.basilbourque.example;
import java.time.DayOfWeek;
import java.util.HashMap;
import java.util.Map;
public class MapDemo {
public static void main ( String[] args ) {
MapDemo app = new MapDemo();
app.doIt();
}
private void doIt ( ) {
int initialCapacity = DayOfWeek.values().length;
Map < DayOfWeek, String > weekCoverage = new HashMap <>( initialCapacity );
weekCoverage.put( DayOfWeek.MONDAY , "Stuart" );
weekCoverage.put( DayOfWeek.TUESDAY , "Wendy" );
weekCoverage.put( DayOfWeek.WEDNESDAY , "Lisa" );
weekCoverage.put( DayOfWeek.THURSDAY , "Jesse" );
weekCoverage.put( DayOfWeek.FRIDAY , "Marvin" );
weekCoverage.put( DayOfWeek.SATURDAY , "Janet" );
weekCoverage.put( DayOfWeek.SUNDAY , "Jarrod" );
System.out.println( weekCoverage );
ReportTool reportTool = new ReportTool();
reportTool.makeHtmlSummaryOfWeekCoverageAndEmailToBoss( weekCoverage );
LoggingTool loggingTool = new LoggingTool();
loggingTool.logWeekCoverage( weekCoverage );
EmployeePagingTool employeePagingTool = new EmployeePagingTool();
employeePagingTool.sendTextMessagesForWeekCoverage( weekCoverage );
}
}
在实际工作中,我们不太可能仅使用String
对象作为员工姓名。我们可能会有一个Employee
类,并且将分配该类的对象。在这种情况下,我们将Map
声明为Map < DayOfWeek, Employee > weekCoverage
。
您可能要防止更改地图。一种实现方法是在Java 9及更高版本中使用Map.of
和Map.ofEntries
。另一种方法是Collections.umodifiableMap
。
关于polymorphism的注释…请注意,我们如何从HashMap
的具体类中实例化一个对象,但是我们将该对象的引用存储为更通用的Map
。然后,我们可以自由地在以后的Map
中使用HashMap
的其他实现,从MapDemo
到其他地图,而无需破坏ReportTool
中的代码。
实际上,我们应该更改该MapDemo
代码。尽管上面的代码可以编译并运行得很好,但是使用枚举对象作为键时,Map
接口的实现更好。与使用枚举作为键的HashMap
相比,EnumMap
类使用的内存更少,并且执行速度更快。 EnumMap
和HashMap
都实现相同的Map
接口。
因此,几个月后我们可以发现这个机会来调整我们的MapDemo
代码,而不必担心ReportTool
受到任何损害。 OOP的主要优点之一是避免了古老的编程问题,因为一个地方的一点改动都会导致其他部分崩溃。
我们更改这两行:
int initialCapacity = DayOfWeek.values().length;
Map < DayOfWeek, String > weekCoverage = new HashMap <>( initialCapacity );
…此行:
Map < DayOfWeek, String > weekCoverage = new EnumMap( DayOfWeek.class );
其他代码均不需要更改。
答案 1 :(得分:0)
更新:我最终只是在Class1中的一个方法中构建并返回哈希图,然后在Class2中创建Class1的实例并调用该方法以返回哈希图
这是一个相当简单的解决方案,不确定为什么很难找到答案。感谢所有尝试提供帮助的人