Вопрос-ответ

What is the exact meaning of static fields in Java?

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

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

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

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

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

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

Переведено автоматически
Ответ 1

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

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

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

Ответ 2

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

Ответ 3

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

Ответ 4

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

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

 общедоступный класс Monostate {

закрытая статическая строка str = "Default";

общедоступная строка getString() {
возвращает str;
}

общедоступный void setString(String s) {
str = s;
}
}

Then you are free to create as many instances of the monostate as you like, but they all share the same underlying object due to the static reference.

   Monostate mono = new Monostate();
mono.setString("Fred");
System.out.println(mono.getString());
2024-03-01 09:56 java jvm