可以将全局声明java RMI的注册表和接口对象吗?

时间:2016-11-27 00:52:33

标签: java rmi distributed-apps

我似乎陷入两难境地。保留项目的复杂细节,我正在尝试执行以下操作。 (为了简单起见,排除和替换一些代码,如import和try-catch)

1  public class Client
2  {
3     private Registry reg1; 
4     private GameSessionInterface sesh1;
5  
6     public static void main(String[] args)
7     {
8        reg1 = LocateRegistry.getRegistry(serverIP, 4200);
9        sesh1 = (GameSessionInterface)reg1.lookup("Session1");
10    }
11 }

在第8行和第9行,我收到错误 “无法对非静态字段reg1进行静态引用” “无法生成静态引用非静态字段sesh1“

如果我在main中声明reg1和sesh1,我不会遇到这个问题。但我至少需要sesh1是全局的,所以我可以让方法在main之外访问它。

我不是100%确定RMI变量在JVM中是如何工作的,所以我不确定将它们声明为静态是否安全。逻辑将遵循,因为我不打算在同一个JVM中创建多个 Client 实例,这应该没关系,但考虑到这是对远程对象的引用,我没有不知道这是否会产生一些看不见的副作用。我已经搜索了一段时间,似乎没有人解决这个问题。但与此同时,我似乎无法找到静态声明的代码示例,这也引出了一个问题,为什么我不能编译它,因为当其他地方存在类似的代码时,全局发出非静态声明。

我真的很喜欢Java中的RMI,所以如果你们中任何一个拥有更多RMI经验的人可以了解所有这些如何相互作用以及为什么我可能会遇到这个错误,我会非常感激。

提前致谢!

1 个答案:

答案 0 :(得分:0)

RMI变量与任何其他变量没有区别。例如,您可以在main()中将这两个变量声明为本地变量。

然而如果您使用LocateRegistry.createRegistry()创建注册表,则必须将其存储到静态变量中。否则它可以被垃圾收集并消失。

  

为什么我不能编译它的问题,因为当其他地方存在类似的代码并且全局发出非静态声明时

不,不。再看一遍。静态和实例变量的规则在整个Java中是相同的。 RMI不会也不能改变它。