Java 初始化构造函数中的枚举变量

Java 初始化构造函数中的枚举变量,java,enums,Java,Enums,我的枚举如下所示: public enum SignMethod { MICROSOFT("Microsoft"),XML("Xml"),HDR("Hdr"),JAVA1("Java1"); private final String name; private ArrayList<Server> servers = new ArrayList<>(); private HashSet<String> fileType

我的枚举如下所示:

public enum SignMethod {    

    MICROSOFT("Microsoft"),XML("Xml"),HDR("Hdr"),JAVA1("Java1");

    private final String name;
    private ArrayList<Server> servers = new ArrayList<>();
    private HashSet<String> fileTypes = new HashSet<>();

    public static void main(String... args) {
        System.out.println(MICROSOFT.getName()+" "+MICROSOFT.getServers()+ " " + MICROSOFT.getFileTypes());
        System.out.println(ServerAndSignMethodInitialiser.getServers(SignMethod.MICROSOFT));
        System.out.println(SignDataInitialiser.getFileTypesList(SignMethod.MICROSOFT));
    }

    private SignMethod(String name) {
        this.name = name;
        this.servers = ServerAndSignMethodInitialiser.getServers(this);
        System.out.println(servers);
        this.fileTypes = SignDataInitialiser.getFileTypesList(this);
        System.out.println(fileTypes);
    }
}
公共枚举签名方法{
微软(“微软”)、XML(“XML”)、HDR(“HDR”)、JAVA1(“JAVA1”);
私有最终字符串名;
私有ArrayList服务器=新建ArrayList();
private HashSet fileTypes=new HashSet();
公共静态void main(字符串…参数){
System.out.println(MICROSOFT.getName()+“”+MICROSOFT.getServers()+“”+MICROSOFT.getFileTypes());
System.out.println(ServerAndSignMethodInitialiser.getServers(SignMethod.MICROSOFT));
System.out.println(SignDataInitialiser.getFileTypesList(SignMethod.MICROSOFT));
}
私有签名方法(字符串名称){
this.name=名称;
this.servers=ServerAndSignMethodInitialiser.getServers(this);
System.out.println(服务器);
this.fileTypes=SignDataInitialiser.getFileTypesList(this);
System.out.println(文件类型);
}
}
我试图通过一个静态初始化器类初始化servers变量,该类有一个从SignMethod enum映射到服务器ArrayList的映射。但当我在构造函数中初始化后立即打印服务器时,它的打印为空。将构造函数中的“this”传递给其他方法时是否存在问题

public static ArrayList<Server> getServers(SignMethod signMethod) {
    System.out.println(signMethod);
    return signmethodToServerMap.get(signMethod);        
}
publicstaticarraylistgetservers(SignMethod-SignMethod){
System.out.println(signMethod);
返回signmethodToServerMap.get(signMethod);
}

当我在getServers方法中使用Priniting signMethod时,它可以打印为“MICROSOFT”等。

我猜这是鸡蛋和鸡的问题

  • 每个枚举值的构造函数都需要调用
    getServers(SignMethod)
    方法
  • getServers(SignMethod)
    方法在
    映射中查找
  • 映射
    将枚举值作为键。因此,在枚举值的构造函数完成之前不能填充它
目前,我可以想出三个解决问题的办法:

  • 保持枚举简单,不要试图在其中存储其他信息。然后,您可以仅依靠
    signmethodToServerMap
    来存储服务器
  • 不要静态初始化映射,只需将
    服务器
    列表存储在枚举中即可
  • 使
    映射独立于枚举。例如,从
    String
    映射到
    Server
    ,然后说

    this.servers = ServerAndSignMethodInitialiser.getServers(this.name);
    

  • 拥有main方法的枚举确实是件奇怪的事情……它实际上在哪里打印null?如何填充
    signmethodToServerMap
    ?1)什么是signmethodToServerMap 2)此代码不会编译