我有一个名为ManagementServiceHandler的类,它实现了一个接口。 在这个类中,有一些变量和方法,其中有一个私有静态映射和两个静态方法:
public class ManagementServiceHandler implements ManagementService.Iface {
private static Map<NodeManifest, Integer> nodePorts;
... other methods and variables
...
...
public static Map<NodeManifest, Integer> getNodePorts() {
return nodePorts;
}
public static void setNodePorts(Map<NodeManifest, Integer> nodePorts) {
ManagementServiceHandler.nodePorts = nodePorts;
}
Object NodeManifest类似于:
class NodeManifest {
String hostName;
List<String> servicelist;
}
其他方法处理对象NodeManifest到Map nodePorts的注册和注销,以及Map中存在的特定服务的NodeManifest请求。如果请求的服务存在,则由要求它的NodeManifest使用。
我有一个包含以下内容的junit测试文件:
public class ManagementServiceTest {
public static class ManagementServer implements Runnable {
code for ManagementServer
}
...
...
public static class ArithmeticServer implements Runnable {
code for ArithmeticServer
}
...
...
public void testArithmeticServerCompletion() throws Exception {
class ArithmeticServiceDispatcher {
public long executeOperation(String opName, int num1, int num2) throws TException {
long result = 0;
for(Map.Entry<NodeManifest, Integer> pair : ManagementServiceHandler.getNodePorts().entrySet()) {
List<String> operations = pair.getKey().serviceList;
if(operations.contains(opName)) {
switch(opName) {
case "addition":
result = arithmeticClient.add(num1, num2);
break;
case "multiplication":
result = arithmeticClient.multiply(num1, num2);
break;
case "substraction":
result = arithmeticClient.substract(num1, num2);
break;
case "division":
result = arithmeticClient.divide(num1, num2);
break;
}
break;
}
}
return result;
}
}
我的问题是,现在,如果我希望测试文件中的方法executeOperation访问包含NodeManifests的正确Map,那么包含在类ManagementServiceHandler中的Map和两个方法getNodePorts()和setNodePorts()必须是静态的注册。
我被告知在这种情况下使用静态方法和变量是不正确的;但是,如果我使那些非静态,那么我需要在executeOperations()中更改一些内容,以便它访问包含所有注册的NodePorts的正确的Map nodePorts。我不能用
ManagementServiceHandler.getNodePorts()
但是我仍然需要访问填充了NodeManifest对象的Map nodePorts中的数据,以使executeOperation()按预期工作。
所以我的问题是两个:
答案 0 :(得分:0)
这里有两个选项,要么将 getters and setters 保留为static methods
,在这种情况下,您可以使用ClassName.methodName()
OR
不要将它们设为静态,在这种情况下,您需要创建类ManagementServiceHandler
的实例并使用objectName.methodName()
调用这些方法...这不是编码决策,它是一个根据您使用课程ManagementServiceHandler
的方式做出的设计决定。
研究单例模式,也许是你的设计模式最适合你。