Полагаю, вопрос сводится к тому, как вы можете инициализировать свои объекты до того, как они будут использованы. Это, в свою очередь, зависит от того, какие данные вам нужны для инициализации. Если вам нужно:
- для выполнения работы по инициализации, которая не зависит от внешней информации, вы можете сделать это при создании объекта (например, в конструкторе или, если вы используете инфраструктуру EE, в чем-то вроде аннотированного метода @PostConstruct), или в статическом блоке инициализации, который будет запущен во время загрузки класса.
- данные из среды вашего пользователя, статические вызовы в классе System могут обеспечить это. Опять же, это можно сделать во время строительства объекта.
- Статический выбор, который пользователи сделали в отношении того, как использовать вашу библиотеку, рассмотрите возможность использования файла свойств (который должен быть задокументирован). Опять же, строительство объекта - время для этого.
- динамический выбор, который пользователи сделали при использовании вашей библиотеки, это будет доступно во время выполнения где-то внутри объектов, сотрудничающих с вашей библиотекой.
Если ваша работа по инициализации требует значительных ресурсов, и вы хотите сделать это при запуске приложения вашего пользователя, то я думаю, что лучший способ достичь этого - документировать требование и попросить пользователей вызвать конкретные методы, которые будут выполнять инициализацию.
С точки зрения пользователя библиотеки, я хочу знать, когда ваша библиотека выполняет работу по инициализации и насколько тяжелой является эта работа. Я не хочу, чтобы библиотека принимала решения о том, когда она будет потреблять ресурсы, особенно при запуске, когда у меня может быть много моего собственного кода запуска, кода инфраструктуры и бесчисленных других битов инициализации, способствующих задержке запуска.
Редактировать : Просто чтобы прояснить, все эти опции находятся на уровне приложения. Сама JVM уже запущена и работает. Мы говорим об инициализации кода приложения, а не о JVM.