Подтвердить что ты не робот

Каково точное значение статических полей в Java?

Я хотел бы поделиться объектом между различными экземплярами объектов того же класса.

Концептуально, когда моя программа запущена, все объекты класса A получают доступ к одному и тому же объекту класса B.

Я видел, что static является общесистемным и что его использование не рекомендуется. Означает ли это, что если у меня есть другая программа, работающая на той же JVM, которая создает объекты класса A, эти объекты могут потенциально обращаться к тому же самому B-объекту, что и тот, который был получен в предыдущей программе?

Каковы обычно недостатки использования статических полей?

Есть ли альтернативы (которые не требуют огромных усилий по реализации)?

4b9b3361

Ответ 1

Static не совсем означает "разделяемый всеми экземплярами" - это означает "вообще не связан с каким-либо конкретным экземпляром". Другими словами, вы можете получить статическое поле в классе A без создания каких-либо экземпляров.

Что касается запуска двух программ в одной JVM, это действительно зависит от того, что вы подразумеваете под "двумя программами". Статическое поле эффективно связано с объектом класса, которое, в свою очередь, связано с загрузчиком классов. Поэтому, если эти две программы используют отдельные экземпляры класса loadload, у вас будет две независимые статические переменные. Если они оба используют один и тот же загрузчик классов, тогда будет только один, чтобы они увидели друг друга.

Что касается альтернативы - существуют различные варианты. Один из них - передать ссылку на "общий" объект на конструктор каждого создаваемого вами объекта, который ему нужен. Затем ему нужно будет сохранить эту ссылку позже. Это может быть немного больно и всасывать немного больше памяти, чем статический подход, но это делает его легко проверяемым.

Ответ 2

Статические методы и участники обескуражены, потому что их часто используют неправильно, но это звучит как ситуация, когда статичность - правильный путь. Что касается статики, разделяемой несколькими программами, это не так. Каждая программа работает в совершенно отдельной среде.

Ответ 4

Предполагая, что все находится в одном загрузчике классов, почему бы не использовать шаблон monostate, чтобы сделать это?

Ваша общая статика скрыта в моностате:

  public class Monostate {

      private static String str = "Default";

      public String getString() {
          return str;
      }

      public void setString(String s) {
          str = s;
      }
  }

Затем вы можете создавать столько экземпляров моностата, сколько захотите, но все они имеют один и тот же базовый объект из-за статической ссылки.

   Monostate mono = new Monostate();
   mono.setString("Fred");
   System.out.println(mono.getString());