我们的机器主机名为-
dbx111.dc1.host.com
dbx112.dc2.host.com
dcx113.dc3.host.com
dcx115.dev.host.com
这里
dc1
,dc2
,dc3
和dev
是我们的数据中心,到目前为止,我们将只有四个数据中心。将来,机器主机名之间可能还会有更多点,并由另一个域分隔。现在,我需要找出当前计算机所在的
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;
}
}