【问题标题】:Yet Another issue with static methods and variables静态方法和变量的另一个问题
【发布时间】: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() 按预期工作。

所以我的问题有两个:

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

【问题讨论】:

  • 您是否尝试向告诉您“在这种情况下使用静态方法和变量不正确”的人提出这些问题?
  • 我会的,但他已经离开了几天,无法联系到我,我需要尽快知道这一点。
  • 也许this 会帮助您解答静态问题。
  • mmh 感谢您的链接,但它对我没有多大帮助,它是关于静态和嵌套类的,但我在一个类中有一个静态方法,并且一个类必须从另一个类访问数据...我很困惑...
  • 好的,我知道我需要实例化一个 ManagementServiceHandler 类型的对象才能访问它的方法,但我还需要访问 Map nodePorts。

标签: java variables methods map static


【解决方案1】:

您有两个选择,将 getter 和 setter 保留为 static methods,在这种情况下,您可以使用 ClassName.methodName() 调用它们

                                   OR

不要将它们设为静态,在这种情况下,您需要创建类 ManagementServiceHandler 的实例并使用 objectName.methodName() 调用这些方法...这不是编码决策,而是您的设计决策必须根据你要使用ManagementServiceHandler类的方式来制作。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-04
    • 1970-01-01
    • 2014-11-23
    • 2012-09-06
    • 1970-01-01
    • 1970-01-01
    • 2015-07-22
    相关资源
    最近更新 更多