静态方法和变量的另一个问题

时间:2014-06-09 08:05:04

标签: java variables methods map static

我有一个名为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()按预期工作。

所以我的问题是两个:

  1. 为什么我不能在这种情况下使用静态?
  2. 如何修改executeOperation()以便它访问 映射由ManagementServiceHandler创建的nodePorts 空?

1 个答案:

答案 0 :(得分:0)

这里有两个选项,要么将 getters and setters 保留为static methods,在这种情况下,您可以使用ClassName.methodName()

调用它们
                                   OR

不要将它们设为静态,在这种情况下,您需要创建类ManagementServiceHandler的实例并使用objectName.methodName()调用这些方法...这不是编码决策,它是一个根据您使用课程ManagementServiceHandler的方式做出的设计决定。

研究单例模式,也许是你的设计模式最适合你。