Могут ли объекты реестра и интерфейса для 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 не меняет и не может это изменить.