我们的机器主机名为-

dbx111.dc1.host.com
dbx112.dc2.host.com
dcx113.dc3.host.com

dcx115.dev.host.com


这里dc1dc2dc3dev是我们的数据中心,到目前为止,我们将只有四个数据中心。将来,机器主机名之间可能还会有更多点,并由另一个域分隔。

现在,我需要找出当前计算机所在的datacenter,因为我将在实际计算机上的代码下运行。

到目前为止,我还有两个流程,一个是USERFLOW,另一个是DEVICEFLOW。

public enum FlowTypeEnum {
    USERFLOW, DEVICEFLOW
}


问题陈述:-


如果我的机器在DC1中并且流类型为USERFLOW,那么我需要返回/test/datacenter/dc1,但是如果流类型为DEVICEFLOW,那么我需要返回/testdevice/datacenter/dc1
但是,如果我的计算机位于DC2中,并且流类型为USERFLOW,那么我需要返回/test/datacenter/dc2,但是如果流类型为DEVICEFLOW,则需要返回/testdevice/datacenter/dc2
并且如果我的机器在DC3中并且流类型是USERFLOW,那么我需要返回/test/datacenter/dc3,但是如果流类型是DEVICEFLOW,那么我需要返回/testdevice/datacenter/dc3
但是,如果我的机器数据中心位于DEV中,并且流类型为USERFLOW,那么我需要返回“ / test / datacenter / dc1”,但是如果流类型为DEVICEFLOW,则需要返回/testdevice/datacenter/dc1


我的下面代码可以正常工作,但根本不使用FlowTypeEnum。如何将Java主目录中的typeEnum值传递给DatacenterEnum类并返回字符串,如上述算法所示-

以下是我的TestsingEnum类-

public class TestingEnum {

    public static void main(String[] args) {
        // FlowTypeEnum typeEnum = FlowTypeEnum.USERFLOW;
        // how to pass this typeEnum value to DatacenterEnum class with the current setup I have
        // and return basis on above algorithm

        System.out.println(DatacenterEnum.LOCAL_POOK);
    }
}


下面是我的DatacenterEnum类-

public enum DatacenterEnum {
    DEV, DC1, DC2, DC3;

    private static final Random random = new Random();

    public static String forCode(int code) {
        return (code >= 0 && code < values().length) ? values()[code].name() : null;
    }

    private static final DatacenterEnum ourlocation = compareLocation();

    private static DatacenterEnum compareLocation() {
        String currenthost = getHostNameOfServer();

        if (currenthost != null) {
            if (isDevMachine(currenthost)) {
                return DC1;
            }

            for (DatacenterEnum dc : values()) {
                String namepart = "." + dc.name().toLowerCase() + ".";
                if (currenthost.indexOf(namepart) >= 0) {
                    return dc;
                }
            }
        }
    }

    private String toLocalPook() {
        if (this == DEV) {
            return "/test/datacenter/dc1";
        }

        return "/test/datacenter/" + name().toLowerCase();
    }

    public static final String LOCAL_POOK = ourlocation.toLocalPook();

    private static final String getHostNameOfServer() {
        try {
            return InetAddress.getLocalHost().getCanonicalHostName().toLowerCase();
        } catch (UnknownHostException e) {
            // log an exception
        }

        return null;
    }

    private static boolean isDevMachine(String hostName) {
        return hostName.indexOf("." + DEV.name().toLowerCase() + ".") >= 0;
    }
}


USERFLOW和DEVICEFLOW之间的唯一区别是-对于USERFLOW,我需要使用/test;对于DEVICEFLOW,我需要使用/testdevice,其他情况相同。

最佳答案

为什么不将流类型传递给toLocalPook方法:

enum Flow {
    USERFLOW , DEVICEFLOW
}
private String toLocalPook(Flow f) {
    String prefix = "";
    if (f.equals(Flow.DEVICEFLOW)) {
        prefix = "/testdevice";
    } else if (f.equals(Flow.USERFLOW)) {
        prefix = "/test";
    }
    if (this == DEV) {
        return prefix + "/datacenter/dc1";
    }

    return prefix + "/datacenter/" + name().toLowerCase();
}


如果执行此操作,则必须更改调用LocalPook的方式。LOCAL_POOK不能是最终静态的:

class OtherClass {
    public static void main(String[] args) {
        String LOCAL_POOK = DatacenterEnum.getOurlocation().toLocalPook(
                Flow.USERFLOW);
        System.out.println(LOCAL_POOK);
    }

}


这是完整的枚举

    public enum DatacenterEnum {
    DEV, DC1, DC2, DC3;


    public static DatacenterEnum getOurlocation() {
        return ourlocation;
    }

    private static final Random random = new Random();

    public static String forCode(int code) {
        return (code >= 0 && code < values().length) ? values()[code].name() : null;
    }

    private static final DatacenterEnum ourlocation = compareLocation();

    private static DatacenterEnum compareLocation() {
        String currenthost = getHostNameOfServer();

        if (currenthost != null) {
            if (isDevMachine(currenthost)) {
                return DC1;
            }

            for (DatacenterEnum dc : values()) {
                String namepart = "." + dc.name().toLowerCase() + ".";
                if (currenthost.indexOf(namepart) >= 0) {
                    return dc;
                }
            }
        }
        return null;
    }

    enum Flow {
        USERFLOW , DEVICEFLOW
    }
    public String toLocalPook(Flow f) {
        String prefix = "";
        if (f.equals(Flow.DEVICEFLOW)) {
            prefix = "/testdevice";
        } else if (f.equals(Flow.USERFLOW)) {
            prefix = "/test";
        }
        if (this == DEV) {
            return prefix + "/datacenter/dc1";
        }

        return prefix + "/datacenter/" + name().toLowerCase();
    }


    private static final String getHostNameOfServer() {
        try {
            return InetAddress.getLocalHost().getCanonicalHostName().toLowerCase();
        } catch (UnknownHostException e) {
            // log an exception
        }

        return null;
    }

    private static boolean isDevMachine(String hostName) {
        return hostName.indexOf("." + DEV.name().toLowerCase() + ".") >= 0;
    }

}

08-04 21:52