栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何用枚举中每种环境类型的值列表表示键?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何用枚举中每种环境类型的值列表表示键?

我从此开始,但是对于如何为每个DC拥有一个键,然后为该DC的计算机列表拥有多个值感到困惑,然后我还需要按环境对它们进行分组。

您忘记了一个重要的建议:枚举可能存储特定于每个枚举值的成员(方法和字段),但

static
如果需要,它也可能存储成员。
您需要直接在enum类中移动按环境分组的地图:

private static final ImmutableMap<Datacenter, ImmutableList<String>> PROD_SERVERS_BY_DC;private static final ImmutableMap<Datacenter, ImmutableList<String>> STAGING_SERVERS_BY_DC;

您可以根据用户请求使用内部地图返回期望的地图:

private static final Map<Env, ImmutableMap<Datacenter, ImmutableList<String>>> SERVERS_BY_ENV;

Env
另一个枚举在哪里:

public static enum Env {    PROD, STAGING}

在我将要提供的代码中,我将其添加为封闭类型,

Datacenter
但是在其自己的文件中可能会更好,因为环境可能不是数据中心专用的概念。

最后,您使用的按环境检索服务器的方式将相关职责划分为两个类(

Datacenter
枚举和当前类):

Map<Datacenter, ImmutableList<String>> machinesByDC = Utils.isProd() ? Utils.PROD_SERVERS_BY_DC : Utils.STAGING_SERVERS_BY_DC;

在枚举中引入执行此操作的方法会更好:

public static ImmutableMap<Datacenter, ImmutableList<String>> getServers(Env env){...}

这将增加枚举类的凝聚力。

这是更新的枚举:

import java.util.HashMap;import java.util.Map;import com.google.common.collect.ImmutableList;import com.google.common.collect.ImmutableMap;import com.google.common.collect.ImmutableMap.Builder;public enum Datacenter {   ABC(Env.PROD, "tcp://machineA:8081", "tcp://machineA:8082"),    DEF(Env.PROD, "tcp://machineB:8081", "tcp://machineB:8082"),    PQR(Env.PROD, "tcp://machineA:8081", "tcp://machineA:8082"),    CORP(Env.STAGING, "tcp://machineC:8081", "tcp://machineC:8082");    public static enum Env {        PROD, STAGING    }    private Env env;    private String[] url;    private static final ImmutableMap<Datacenter, ImmutableList<String>> PROD_SERVERS_BY_DC;    private static final ImmutableMap<Datacenter, ImmutableList<String>> STAGING_SERVERS_BY_DC;    private static final Map<Env, ImmutableMap<Datacenter, ImmutableList<String>>> SERVERS_BY_ENV;    static {        Builder<Datacenter, ImmutableList<String>> prodDataCenterBuilder = ImmutableMap.<Datacenter, ImmutableList<String>>builder();        Builder<Datacenter, ImmutableList<String>> stagingDataCenterBuilder = ImmutableMap.<Datacenter, ImmutableList<String>>builder();        for (Datacenter datacenter : Datacenter.values()) { if (datacenter.env == Env.PROD) {     prodDataCenterBuilder.put(datacenter, ImmutableList.of(datacenter.url)); } else if (datacenter.env == Env.STAGING) {     stagingDataCenterBuilder.put(datacenter, ImmutableList.of(datacenter.url)); } else {     throw new IllegalArgumentException("not exepected env " + datacenter.env); }        }        PROD_SERVERS_BY_DC = prodDataCenterBuilder.build();        STAGING_SERVERS_BY_DC = stagingDataCenterBuilder.build();        SERVERS_BY_ENV = new HashMap<>();        SERVERS_BY_ENV.put(Env.PROD, PROD_SERVERS_BY_DC);        SERVERS_BY_ENV.put(Env.STAGING, STAGING_SERVERS_BY_DC);    }    Datacenter(Env env, String... url) {        this.env = env;        this.url = url;    }    public static ImmutableMap<Datacenter, ImmutableList<String>> getServers(Env env) {        ImmutableMap<Datacenter, ImmutableList<String>> map = SERVERS_BY_ENV.get(env);        if (map == null) { throw new IllegalArgumentException("not exepected env " + env);        }        return map;    }}

以及如何使用它:

public static void main(String[] args) { ImmutableMap<Datacenter, ImmutableList<String>> servers = Datacenter.getServers(Env.PROD);    servers.forEach((k, v) -> System.out.println("prod datacenter=" + k + ", urls=" + v));    servers = Datacenter.getServers(Env.STAGING);    servers.forEach((k, v) -> System.out.println("staging datacenter=" + k + ", urls=" + v));}

输出

产品数据中心= ABC,网址= [tcp:// machineA:8081,tcp:// machineA:8082]

产品数据中心= DEF,网址= [tcp:// machineB:8081,tcp:// machineB:8082]

产品数据中心= PQR,网址= [tcp:// machineA:8081,tcp:// machineA:8082]

登台数据中心= CORP,网址= [tcp:// machineC:8081,tcp:// machineC:8082]



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/440724.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号