Morteza Adi
Morteza Adi

Reputation: 2473

single-element enum type singletone with lazy loading capability

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?

Upvotes: 9

Views: 3649

Answers (2)

DaoWen
DaoWen

Reputation: 33019

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.

Upvotes: 9

bsiamionau
bsiamionau

Reputation: 8229

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:

Upvotes: 8

Related Questions