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

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

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

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

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

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

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

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

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

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

То, что вы ищете, называется шаблоном Singleton .

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

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

   public class Monostate {

       private static String str = "Default";

       public String getString () {
           return str;
       }

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

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

    Monostate mono = new Monostate ();
    mono.setString ( "Fred");
    System.out.println (mono.getString ());
  • Статические переменные в базовом classе, разделяемые всеми производными classами?
  • Какая правильная альтернатива статическому наследованию метода?
  • Как и где использовать Static-модификатор в Java?
  • Статическое ключевое слово в c #
  • Как использовать функцию C # 6 «Использование статического»?
  • Область статической переменной в многопользовательском веб-приложении ASP.NET
  • В чем причина «нестатического метода нельзя ссылаться из статического контекста»?
  • Измененный массив в области файлов
  • Почему мы не должны использовать защищенный static в java
  • Файлы Jango Static 404
  • Можно ли использовать экземпляр Gson как статическое поле в компоненте модели (повторное использование)?
  • Давайте будем гением компьютера.