Есть два способа достичь этого. Один из них заключается в том, чтобы сделать метод «populateMyMap» статическим инициализатором (или подход, предложенный A.H.). Тогда он гарантированно будет выполнен перед первым статическим вызовом. Обычно это лучший способ, если предположить, что либо стоимость запуска populateMyMap достаточно мала, чтобы не быть замеченной, либо если вы собираетесь использовать функциональные возможности класса почти каждый раз, когда запускается приложение.
Альтернативный подход - это то, что вы использовали бы, если бы выполнение «populateMyMap» занимало значительное количество времени И либо вы либо не используете функциональность для некоторых выполнений приложения, либо хотите отложить выполнение populateMyMap до тех пор, пока данные не понадобятся, чтобы не излишне увеличивать время запуска.
Если вам нужен второй подход, вам следует переключать структуры и использовать Singleton, а не статические методы. Сделайте методы (и данные) нестатичными, и каждый из них получит экземпляр Singleton перед вызовом метода. Вызовите «populateMyMap» в (приватном) конструкторе. Да, я знаю, у синглетонов плохая репутация, и люди всегда говорят: «Избегайте их, потому что они просто замаскированные глобальные методы», но статические методы также являются просто глобальными методами. Вы ничего не теряете. И таким образом вы не оплачиваете стоимость выполнения populateMyMap до тех пор, пока вам не понадобится (или за исключением случаев).
ВНИМАНИЕ: Если ваши структуры данных не являются неизменяемыми, то есть они могут быть изменены после их инициализации, то вам, вероятно, не следует использовать любую из этих структур.