2016-11-27 10 views
0

私はジレンマがあるようです。私のプロジェクトの複雑な詳細を控えて、私は次のことをしようとしています。 (簡略化のため除くと輸入のようないくつかのコードを交換してみてください-キャッチ)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をstatic参照できません」を取得しますおよび"非静的フィールドsesh1への静的参照を作成できません"

mainの中でreg1とsesh1を宣言しても、この問題は発生しません。しかし、私は非常に最小限のsesh1でグローバルにする必要があるので、メソッドをmainの外でアクセスできるようにすることができます。

私は100%RMI変数がJVMでどのように機能するのかわからないので、静的変数として宣言するのが安全かどうかは分かりません。 Logicは、私がのクライアントの複数のインスタンスを同じJVMに作成する予定ではないので、これに従います。これは問題ではありませんが、これはリモートオブジェクトへの参照であると考えています見えない副作用があります。私はしばらく検索しましたが、誰もこれに対処していないようです。しかし同時に、静的宣言されたコードの例を見つけることができないように見えます。静的宣言を使用して他の場所に同様のコードが存在するようにコンパイルすることはできません。

私は本当にRMIをJavaで新しくしていますので、より多くのRMI体験をお持ちの方なら、これがどのように相互作用し、なぜこのエラーが発生するのかを明らかにすることができれば幸いです。

ありがとうございます!

答えて

0

RMI変数は他の変数と変わりありません。たとえば、両方の変数をローカルとしてmain()の範囲内で宣言することができます。

LocateRegistry.createRegistry()でレジストリを作成する場合は、静的変数に格納することが不可欠です。さもなければ、それはガベージコレクションされ、消えることがあります。

であるのと同様のコードが、それはないグローバル

ノー作られた非static宣言して別の場所に存在する場合、私はそれをコンパイルできない理由を質問。もう一度見てください。静的変数とインスタンス変数のルールはJava全体で同じです。 RMIはそれを変更せず、変更できません。

関連する問題