简体   繁体   中英

How to use Enum for singleton?

I have studied the use of Enum to implement Singleton design pattern as Java ensures that any enum value is instantiated only once in a Java program. Since Java Enum values are globally accessible, so is the singleton.


class ConfigManagerWithEagerInitialization {

    public static ConfigManagerWithEagerInitialization instance = new ConfigManagerWithEagerInitialization();

    private Map<String, String> configMap = new HashMap<String, String>() {{
        put("host", "internal.db");
        put("port", "8179");
        put("user", "admin");
        put("password", "pa$$w0rD");
    }};

    private ConfigManagerWithEagerInitialization() {

    }

    public String update(String key, String value) {
        return configMap.put(key, value);
    }

    public String get(String key) {
        return configMap.get(key);
    }

    public static ConfigManagerWithEagerInitialization getInstance() {
        return instance;
    }
}

class Scratch_1 {
    public static void main(String[] args) {

        ConfigManagerWithEagerInitialization configManager =  ConfigManagerWithEagerInitialization.getInstance() ;
        System.out.println(configManager.get("password"));


    }
}

How can I convert this class into enum singleton?

You can create an enum and add one constructor to translate these predefined values. One example below:-

public class Scratch_1 {

public static void main(String[] args) {
    
    System.out.println(ConfigManagerWithEagerInitialization.PASSWORD.getValue());
}
}

public enum ConfigManagerWithEagerInitialization {
  HOST("internal.db"), PORT("8179"), USER("admin"), PASSWORD("pa$$w0rD");

  private String value;

  ConfigManagerWithEagerInitialization(String s) {
     this.value = s;
  }

  public String getValue() {
      return this.value;
  }
}

Singleton implementation using Enum

import java.util.HashMap;
import java.util.Map;

public enum ConfigManagerWithEagerInitialization {
    INSTANCE;

    private static final Map<String, String> CONFIGMAP = new HashMap<String, String>();

    static {
        CONFIGMAP.put("host", "internal.db");
        CONFIGMAP.put("port", "8179");
        CONFIGMAP.put("user", "admin");
        CONFIGMAP.put("password", "pa$$w0rD");
    }

    public String update(String key, String value) {
        return CONFIGMAP.put(key, value);
    }

    public String get(String key) {
        return CONFIGMAP.get(key);
    }
}

Main class implementation:

public class Scratch_1 {
    public static void main(String[] args) {

        ConfigManagerWithEagerInitialization configManager =  ConfigManagerWithEagerInitialization.INSTANCE;
        System.out.println(configManager.get("password"));
    }
}

Output:

pa$$w0rD

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM