У меня есть класс, инициализация которого занимает довольно много времени; он вызывает сервер, и серверу требуется несколько минут, чтобы стать готовым.Как гарантировать загрузку классов
Методы этого класса не вызываются довольно долгое время, и они всегда вызываются из класса, который автоматически загружается при запуске. Моя настройка такова:
class SlowToStartUp {
public static void init() {
// do nothing
}
static {
initiateConnectionToServer()
}
public static V invokeServer() {
waitForServerToConnect();
return valueFromServer();
}
}
class AlwaysLoaded {
static {
SlowToStartUp.init();
}
public void someMethod() {
V v = SlowToStartUp.invokeServer();
}
Это выглядит как конструктивно правильно. Если бы не было функции init()
вообще, initiateConnectionToServer()
не вызывается до тех пор, пока someMethod()
не понадобится класс в первый раз, а затем будет ненужная (и в моей системе, неприемлемая) задержка.
Если я положил звонок initiateConnectionToServer()
в init()
, интерфейс был бы более хрупким (поскольку звонок может быть забыт).
Но теперь мне интересно, перехитрил ли я себя. Компилятор может видеть, что init()
пуст. Могло ли это не просто оптимизировать вызов? Теперь это не так, но это гарантировано?
Я пробовал маркировку init()
как volatile
, но это недопустимо.
Я рассматриваю возможность ввода фактической инициализации в init()
, убедившись, что он идемпотент, и вызывая его из статического блока, чтобы быть в безопасности, но я подумал, что сначала попрошу совета.
Не могли бы вы инициализировать конструктор класса, а затем просто задержать создание экземпляра своего класса, пока он не понадобится? Это позволит избежать необходимости вызывать статический класс init(), но будет проблематичным, если вам потребуется быстрый ответ от вашего класса. – Brian
Это точно. Программа запускается в полночь в пятницу. Человек использует его в понедельник утром. Я не хочу, чтобы ей приходилось ждать две минуты, пока происходит соединение. – Malvolio
Можно ли создать экземпляр объекта при первом запуске программы? Если вы можете гарантировать, что никто не понадобится в течение некоторого времени, вы всегда можете дождаться завершения загрузки основного класса до вызова конструктора. – Brian