2016-11-27 49 views
0

我似乎有一個困境。避免我的項目的複雜細節,我試圖做到以下幾點。 (不包括和更換像進口一些代碼和的try-catch爲簡單起見)Java RMI的註冊表和接口對象是否可以在全局中聲明爲靜態的?

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」進行靜態引用。

如果我聲明reg1和sesh1裏面的主,我不明白這個問題。但我需要在最低限度sesh1是全球性的,所以我可以使方法訪問它的主要之外。

我不是100%確定RMI變量如何在JVM中工作,所以我不確定將它們聲明爲靜態是否安全。因爲我不打算在相同的JVM中創建多個Client的實例,所以它應該沒有關係,但考慮到這是對遠程對象的引用,我不知道這是否是這樣會有一些看不見的副作用。我搜索了一段時間,似乎沒有人解決這個問題。但同時,我似乎無法找到靜態聲明的代碼示例,這也引發了一個問題,爲什麼我不能像其他地方使用全局非靜態聲明時存在的類似代碼那樣對其進行編譯。

我真的是新來的Java在RMI,所以如果你有任何人有更多的RMI經驗可以揭示一切如何交互,爲什麼我可能會得到這個錯誤,我將不勝感激。

在此先感謝!

回答

0

RMI變量與任何其他變量沒有區別。例如,您可以在main()內聲明兩個變量均爲本地變量。

但是如果您要創建與LocateRegistry.createRegistry()註冊表,它把它存儲到一個靜態變量是必不可少的。否則,它可以被垃圾收集並消失。

時類似的代碼,在全球

沒有作出非靜態聲明它不會在其他地方存在,爲什麼我不能編譯它是個問題。再看一遍。整個Java中的靜態和實例變量的規則是相同的。 RMI不會也不能改變這一點。

相關問題