Могут ли объекты реестра и интерфейса для Java RMI быть объявлены статическими глобально?

Кажется, у меня дилемма. Избавляясь от сложных деталей моего проекта, я пытаюсь сделать следующее. (исключая и заменяя некоторый код, такой как 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" соответственно.

если я объявляю reg1 и sesh1 внутри main, я не получаю эту проблему. Но мне нужно, чтобы как минимум sesh1 был глобальным, чтобы я мог создавать методы, обращающиеся к нему за пределами main.

Я не уверен на 100%, как работают переменные RMI в JVM, поэтому я не уверен, безопасно ли объявлять их как статические. Логика будет следовать, поскольку я не собираюсь создавать более одного экземпляра Client в одной и той же JVM, это не должно иметь значения, но, учитывая, что это ссылка на удаленный объект, я не знал, будет ли это некоторые невидимые побочные эффекты. Я искал некоторое время, и никто, кажется, не решает эту проблему. Но в то же время я не могу найти примеры кода с этим объявленным статически, что также вызывает вопрос, почему я не могу скомпилировать его, как есть, когда подобный код существует в другом месте с нестатическими объявлениями, сделанными глобально.

Я ДЕЙСТВИТЕЛЬНО новичок в RMI в Java, так что если кто-то из вас с большим опытом работы с RMI сможет пролить свет на то, как все это взаимодействует и почему я могу получить эту ошибку, я был бы очень признателен.

Заранее спасибо!

1 ответ

Переменные RMI ничем не отличаются от любых других переменных. Например, вы могли бы объявить обе переменные как локальные в main(),

Однако, если вы создаете реестр с LocateRegistry.createRegistry(), важно сохранить его в статической переменной. В противном случае он может быть собран мусором и исчезнуть.

вопрос, почему я не могу скомпилировать его, как есть, когда подобный код существует в другом месте с нестатическими объявлениями, сделанными глобально

Нет, это не так. Посмотри снова. Правила для статических переменных и переменных экземпляра одинаковы во всем Java. RMI не меняет и не может это изменить.

Другие вопросы по тегам