Как мне построить HashMap в одном классе, а затем использовать его в другом в Java? - PullRequest
0 голосов
/ 09 ноября 2018

По сути, все, что я хочу сделать, - это создать объект 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
    }
}

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

Обновление: я закончил тем, что просто собрал и возвратил хеш-карту в одном методе в Class1, затем создал экземпляр Class1 в Class2 и вызвал метод для возврата хеш-карты

Это было довольно простое решение, не уверенное, почему так трудно было найти ответ. Спасибо всем, кто пытался помочь

0 голосов
/ 09 ноября 2018

Передать ссылку на объект в вызове метода

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

Ни один другой код не нуждается в изменении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...