簡體   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