我想在同一类的各种对象实例之间共享一个对象。
从概念上讲,当我的程序运行时,A类的所有对象都访问B类的同一对象。
我已经看到static
是系统范围的,并且不建议使用它。这是否意味着如果我在实例化A类对象的同一JVM上运行另一个程序,这些对象可能会访问与前一个程序中访问的对象相同的B对象?
使用静态字段背后的缺点通常是什么?
是否有其他选择(不需要大量实施)?
答案 0 :(得分:66)
静态并不意味着“由所有实例共享” - 它意味着“根本不与特定实例相关”。换句话说,您可以在A类的静态字段中获取任何实例。
至于在同一个JVM中运行两个程序 - 它实际上取决于“运行两个程序”的确切含义。静态字段有效与类对象相关联,而类对象又与类加载器相关联。因此,如果这两个程序使用单独的类加载器实例,那么您将拥有两个独立的静态变量。如果他们都使用相同的类加载器,那么只有一个,所以他们会看到彼此的变化。
至于替代方案 - 有各种选择。一种方法是将对“共享”对象的引用传递给您创建的每个需要它的对象的构造函数。然后它需要存储该引用以供日后使用。这可能有点痛苦,并且比静态方法吸收更多内存,但它确实易于测试。
答案 1 :(得分:2)
不鼓励使用静态方法和成员,因为它们经常被误用,但这听起来像静态是正确的方法。对于跨多个程序共享的静态,情况并非如此。每个程序都在完全独立的环境中运行。
答案 2 :(得分:-1)
您要找的是Singleton Pattern。
答案 3 :(得分:-1)
假设所有内容都在同一个类加载器中,那么为什么不使用monostate模式来执行此操作?
您的共享静态隐藏在monostate中:
public class Monostate { private static String str = "Default"; public String getString() { return str; } public void setString(String s) { str = s; } }
然后你可以自由地创建任意数量的monostate实例,但是由于静态引用,它们都共享相同的底层对象。
Monostate mono = new Monostate(); mono.setString("Fred"); System.out.println(mono.getString());