Каково точное значение статических полей в Java?
Я хотел бы поделиться объектом между различными экземплярами объектов того же класса.
Концептуально, когда моя программа запущена, все объекты класса A получают доступ к одному и тому же объекту класса B.
Я видел, что static
является общесистемным и что его использование не рекомендуется. Означает ли это, что если у меня есть другая программа, работающая на той же JVM, которая создает объекты класса A, эти объекты могут потенциально обращаться к тому же самому B-объекту, что и тот, который был получен в предыдущей программе?
Каковы обычно недостатки использования статических полей?
Есть ли альтернативы (которые не требуют огромных усилий по реализации)?
Ответы
Ответ 1
Static не совсем означает "разделяемый всеми экземплярами" - это означает "вообще не связан с каким-либо конкретным экземпляром". Другими словами, вы можете получить статическое поле в классе A без создания каких-либо экземпляров.
Что касается запуска двух программ в одной JVM, это действительно зависит от того, что вы подразумеваете под "двумя программами". Статическое поле эффективно связано с объектом класса, которое, в свою очередь, связано с загрузчиком классов. Поэтому, если эти две программы используют отдельные экземпляры класса loadload, у вас будет две независимые статические переменные. Если они оба используют один и тот же загрузчик классов, тогда будет только один, чтобы они увидели друг друга.
Что касается альтернативы - существуют различные варианты. Один из них - передать ссылку на "общий" объект на конструктор каждого создаваемого вами объекта, который ему нужен. Затем ему нужно будет сохранить эту ссылку позже. Это может быть немного больно и всасывать немного больше памяти, чем статический подход, но это делает его легко проверяемым.
Ответ 2
Статические методы и участники обескуражены, потому что их часто используют неправильно, но это звучит как ситуация, когда статичность - правильный путь. Что касается статики, разделяемой несколькими программами, это не так. Каждая программа работает в совершенно отдельной среде.
Ответ 3
То, что вы ищете, называется Singleton Pattern.
Ответ 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());