single-element enum type singletone with lazy loading capability

。_饼干妹妹 提交于 2020-08-22 05:47:11

问题


I read many forums and posts about different style to implement single-tone pattern in java and seems "Enum are the best way to implement singletone pattern in java"!! I wonder how can i use Java Enum to implement SingleTone pattern in java with lazy-loading capability. since Enums are just classes. The first time a class is used, it gets loaded by the JVM and all of its static initialization is done. the enum members are static , so they're all going to be initialized.

does anyone know how can i use enum with lazyloading support?


回答1:


The reason the source you read said it's the easiest way to do lazy singletons is because it should just work. Try this:

public class LazyEnumTest {
  public static void main(String[] args) throws InterruptedException {
    System.out.println("Sleeping for 5 seconds...");
    Thread.sleep(5000);
    System.out.println("Accessing enum...");
    LazySingleton lazy = LazySingleton.INSTANCE;
    System.out.println("Done.");
  }
}

enum LazySingleton {
  INSTANCE;
  static { System.out.println("Static Initializer"); }
}

Here's the output I get in the console:

$ java LazyEnumTest
Sleeping for 5 seconds...
Accessing enum...
Static Initializer
Done.



回答2:


The first time a class is used, it gets loaded by the JVM and all of its static initialization is done. the enum members are static , so they're all going to be initialized.

Actually, classloader loads classes (sounds funny) only after you are accessing this classes first time. And only one reason to access enum-singleton class is to get it's instance.

That is why single-element enum type singletone in Java are called lazy - it's value is not initialized before you first time access it.

Similar questions:

  • Java: Lazy Initializing Singleton
  • Lazy-loaded singleton: Double-checked locking vs Initialization on demand holder idiom


来源:https://stackoverflow.com/questions/15470433/single-element-enum-type-singletone-with-lazy-loading-capability

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!