나는 초기화에 꽤 시간이 걸리는 클래스가있다; 서버를 호출하고 해당 서버가 준비되는 데 몇 분이 걸립니다.클래스 로딩을 보장하는 방법
해당 클래스의 메소드는 꽤 오래 호출되지 않으며 항상 시작시 자동으로로드되는 클래스에서 호출됩니다. 내 설정은 다음과 같습니다.
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()
함수가 전혀 없으면 처음으로 someMethod()
클래스가 필요하기 전까지 initiateConnectionToServer()
이 호출되지 않아 불필요한 (그리고 내 시스템에서 용인 할 수없는) 지연이 발생합니다.
initiateConnectionToServer()
전화를 init()
에 넣으면 전화가 끊길 수 있으므로 인터페이스가 더 약해집니다.
그러나 지금 나는 자신보다 현명하지 못한가 궁금합니다. 컴파일러에서 init()
이 비어 있음을 알 수 있습니다. 전화를 최적화 할 수는 없습니까? 지금은 그렇게하지 않지만 보장은 있습니까?
init()
을 volatile
으로 표시하려고 시도했지만 허용되지 않습니다.
실제 초기화를 init()
에 넣고, 멱등수인지 확인하고, 정적 블록에서 호출하여 안전면을 확보하는 것을 고려하고 있지만, 먼저 조언을 요청할 것이라고 생각했습니다.
클래스 생성자에서 초기화를 수행하지 않아도되고 간단하게 클래스가 필요하게 될 때까지 인스턴스 생성을 지연시킬 수 있습니까? 이렇게하면 정적 init() 클래스를 호출하는 것을 잊지 않아도되지만 클래스에서 빠른 응답이 필요한 경우 문제가됩니다. – Brian
그게 전부입니다. 이 프로그램은 금요일 자정에 시작됩니다. 월요일 아침에 사람이 사용합니다. 나는 연결이 이루어지는 동안 그녀가 2 분을 기다려야하는 것을 원하지 않는다. – Malvolio
프로그램을 처음 시작하면 개체를 인스턴스화하는 것이 가능합니까? 아무도 그것을 얼마 동안 필요로하지 않는다고 보장 할 수 있다면, 생성자를 호출하기 전에 메인 클래스 로딩이 끝날 때까지 기다릴 수 있습니다. – Brian