【发布时间】:2014-06-09 08:05:03
【问题描述】:
我有一个名为 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()
但我仍然需要访问 Map nodePorts 中填充有 NodeManifest 对象的数据,以使 executeOperation() 按预期工作。
所以我的问题有两个:
- 为什么在这种情况下我不能使用静态?
- 如何修改 executeOperation() 以使其能够访问 映射不是由 ManagementServiceHandler 创建的 nodePorts 空吗?
【问题讨论】:
-
您是否尝试向告诉您“在这种情况下使用静态方法和变量不正确”的人提出这些问题?
-
我会的,但他已经离开了几天,无法联系到我,我需要尽快知道这一点。
-
也许this 会帮助您解答静态问题。
-
mmh 感谢您的链接,但它对我没有多大帮助,它是关于静态和嵌套类的,但我在一个类中有一个静态方法,并且一个类必须从另一个类访问数据...我很困惑...
-
好的,我知道我需要实例化一个 ManagementServiceHandler 类型的对象才能访问它的方法,但我还需要访问 Map nodePorts。
标签: java variables methods map static