ฉันใช้บล็อกรหัสคงที่เพื่อเริ่มต้นตัวควบคุมบางตัวในรีจิสทรีที่ฉันมี ดังนั้นคำถามของฉันคือฉันสามารถรับประกันได้หรือไม่ว่าบล็อกรหัสคงที่นี้จะถูกเรียกใช้เพียงครั้งเดียวเมื่อโหลดคลาสครั้งแรก ฉันเข้าใจว่าฉันไม่สามารถรับประกันได้ว่าจะเรียกบล็อกโค้ดนี้เมื่อใดฉันคาดเดาว่าเมื่อใดที่ Classloader โหลดครั้งแรก ฉันรู้ว่าฉันสามารถซิงโครไนซ์กับคลาสในบล็อกโค้ดแบบคงที่ได้ แต่ฉันเดาว่านี่คือสิ่งที่เกิดขึ้นจริงหรือ?
ตัวอย่างโค้ดง่ายๆจะเป็น;
class FooRegistry {
static {
//this code must only ever be called once
addController(new FooControllerImpl());
}
private static void addController(IFooController controller) {
// ...
}
}
หรือฉันควรทำเช่นนี้
class FooRegistry {
static {
synchronized(FooRegistry.class) {
addController(new FooControllerImpl());
}
}
private static void addController(IFooController controller) {
// ...
}
}