What is the exact meaning of static fields in Java?
Каково точное значение статических полей в Java?
Я хотел бы поделиться объектом между различными экземплярами объектов одного и того же класса.
Концептуально, пока моя программа запущена, все объекты класса A обращаются к одному и тому же объекту класса B.
Я видел, что static является общесистемным и что его использование не рекомендуется. Означает ли это, что если у меня есть другая программа, запущенная на той же JVM, которая создает экземпляры объектов класса A, эти объекты потенциально могут обращаться к тому же объекту B, к которому обращались в предыдущей программе?
Каковы обычно недостатки использования статических полей?
Существуют ли какие-либо альтернативы (которые не требуют огромных усилий по реализации)?
Переведено автоматически
Ответ 1
Static не совсем означает "совместно используемые всеми экземплярами" - это означает "вообще не связанные с конкретным экземпляром". Другими словами, вы могли бы получить доступ к статическому полю в классе A, даже не создавая никаких экземпляров.
Что касается запуска двух программ в одной JVM - это действительно зависит от того, что именно вы подразумеваете под "запуском двух программ". Статическое поле эффективно связано с объектом класса, который, в свою очередь, связан с загрузчиком классов. Итак, если эти две программы используют отдельные экземпляры classloader, у вас будут две независимые статические переменные. Если они оба используют один и тот же classloader, то будет только один, чтобы они могли видеть изменения друг друга.
Что касается альтернативы - существуют различные варианты. Один из них - передать ссылку на "общий" объект конструктору каждого создаваемого вами объекта, которому это необходимо. Затем ему нужно будет сохранить эту ссылку на потом. Это может быть немного затруднительно и отнимать немного больше памяти, чем статический подход, но это упрощает тестирование.
Ответ 2
Статические методы и члены не рекомендуются, потому что ими так часто злоупотребляют, но это похоже на ситуацию, когда статика - правильный путь. Что касается статики, разделяемой несколькими программами, это не тот случай. Каждая программа выполняется в совершенно отдельной среде.