Каково точное значение статических полей в Java? - PullRequest
34 голосов
/ 28 апреля 2009

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

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

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

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

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

Ответы [ 4 ]

66 голосов
/ 28 апреля 2009

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

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

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

2 голосов
/ 28 апреля 2009

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

0 голосов
/ 28 апреля 2009

Если все находится в одном загрузчике классов, то почему бы не использовать шаблон 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());
0 голосов
/ 28 апреля 2009

То, что вы ищете, называется Singleton Pattern .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...