繁体   English   中英

在构造函数中初始化Enum变量

[英]Initialising Enum variables in constructor

我的枚举看起来像这样:

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

我正在尝试通过静态初始化程序类初始化服务器变量,该类具有一个从SignMethod枚举映射到服务器ArrayList的映射。 但是,当我在构造函数中初始化后立即打印服务器时,其打印为null。 将构造函数中的“ this”传递给其他方法是否存在一些问题。

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

当我在getServers方法中优先使用signMethod时,其打印方式为“ MICROSOFT”等。

猜猜这是鸡蛋和鸡肉的问题。

  • 每个枚举值的构造函数都需要调用getServers(SignMethod)方法。
  • getServers(SignMethod)方法在Map
  • Map具有枚举值作为键。 因此, 不能在枚举值的构造函数完成之前填充它。

目前,我可以想到三种解决方案:

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

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

暂无
暂无

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

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