繁体   English   中英

如何为 singleton 使用枚举?

[英]How to use Enum for singleton?

我研究了使用枚举来实现 Singleton 设计模式,因为 Java 确保任何枚举值在 Java 程序中仅实例化一次。 由于 Java 枚举值是全局可访问的,因此 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"));


    }
}

我如何将这个 class 转换成枚举 singleton?

您可以创建一个枚举并添加一个构造函数来转换这些预定义的值。 下面的一个例子:-

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 使用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);
    }
}

主要class实现:

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

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

Output:

pa$$w0rD

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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