Передать ссылку на объект в вызове метода
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
мы создаем экземпляр нашего приложения, чтобы начать работу. Это решает парадокс курица или яйцо из ООП . Не сосредотачивайтесь на этом методе, поскольку вы изучаете Java. Я думаю, что это скорее хак, опора, чтобы вытащить нас из земли (хост-компьютер, операционная система, файлы, память, которая еще не распределена) в рай (чудесный ООП-рай, где нет ничего, кроме чистых объектов, плавающих вокруг и передающих сообщения друг другу ).
Реальное действие заключается в методе doIt
, в котором мы строим перечисляемые объекты Map
из DayOfWeek
, ведущие к String
, содержащему имя сотрудника, покрывающего некоторую ответственность в тот день ( такие как перенос пейджера по вызову).
enum
означает набор именованных объектов, уже созданных для нас. В этом случае мы уже создали семь DayOfWeek
объектов, по одному на каждый день недели. Ничего особенного в этом нет, объект enum - это просто объект, но объект, для которого new DayOfWeek
уже был вызван заранее, когда класс был загружен JVM .
.
Мы заполняем нашу карту ключом каждого дня недели, и каждый ключевой объект 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
.
Возможно, вы захотите предотвратить изменения на карте. Одним из способов сделать это является использование Map.of
& Map.ofEntries
в Java 9 и более поздних версиях. Другой способ это Collections.umodifiableMap
.
Замечание о полиморфизме ... Обратите внимание, как мы создаем экземпляр объекта из конкретного класса HashMap
, но мы сохраняем ссылку на этот объект как более общий Map
. Затем мы можем потом использовать какую-то другую реализацию Map
из HashMap
для какой-либо другой карты без нашего MapDemo
, не нарушая наш код в ReportTool
.
Действительно, мы должны изменить этот MapDemo
код. Хотя приведенный выше код компилируется и работает достаточно хорошо, в случае использования в качестве ключа объектов enum лучше реализовать интерфейс Map
. Класс EnumMap
использует меньше памяти и выполняется быстрее, чем HashMap
при использовании в качестве ключей перечислений. И EnumMap
, и HashMap
реализуют один и тот же интерфейс Map
.
Таким образом, мы могли бы спустя месяцы обнаружить возможность изменить наш код MapDemo
, не опасаясь какого-либо вреда в ReportTool
. Одним из основных преимуществ ООП является избежание давней проблемы программирования, когда одно небольшое изменение в одном месте приводит к взрыву других компонентов.
Мы меняем эти две строки:
int initialCapacity = DayOfWeek.values().length;
Map < DayOfWeek, String > weekCoverage = new HashMap <>( initialCapacity );
… к этой единственной строке:
Map < DayOfWeek, String > weekCoverage = new EnumMap( DayOfWeek.class );
Ни один другой код не нуждается в изменении.