假设我有一个类A
,并且该类有一个列表l
。还有一个类 B
扩展了 A
,它将访问列表 l
,如下所示。在我的程序中,必须只有一个类 B
的实例(我使用的是单例模式),并且也必须只有一个 List l
的实例,所以我这样做:
public abstract class A {
protected List<String> l;
public A() {}
protected synchronized List<String> getList() {
if (l == null)
l = new LinkedList<String>();
return l;
}
}
//---
public class B extends A {
private static B instance;
private B() {
super();
}
public static synchronized B getInstance() {
if (instance == null)
instance = new B();
return instance;
}
}
我想做的是:
在 B
的一个实例中:
System.out.println(super.getList().size()); //must print 0
super.getList().add("a");
System.out.println(super.getList().size()); //will print 1
在 B
的另一个实例中:
System.out.println(super.getList().size()); //should print 1, cause i've already
//added "a", but prints 0
super.getList().add("b");
System.out.println(super.getList().size()); //should print 2, but prints 1
但这并没有按预期工作。我究竟做错了什么?谁能帮我吗?
编辑:
嗨,蜥蜴比尔,这里有两个类:
public abstract class A {
protected static List<String> l;
public A() {}
protected static synchronized List<String> getList() {
if (l == null)
l = new LinkedList<String>();
return l;
}
}
//---
public class B extends A {
private static B instance;
private B() {
super();
}
public static synchronized B getInstance() {
if (instance == null)
instance = new B();
return instance;
}
public void metodo() {
System.out.println(super.getList().size());
super.getList().add("a");
System.out.println(super.getList().size());
}
}
这就是我创建 B 实例的方式:
public class ClassTeste {
public static void main(String[] args) {
B b = B.getInstance();
b.metodo();
}
}
最佳答案
我已经使用以下主要方法运行了您的主要修订代码,
public static void main(String[] args) { B b1 = B.getInstance(); b1.metodo(); B b2 = B.getInstance(); b2.metodo(); }
并得到以下输出,与您正在寻找的内容相匹配
0 1 1 2
关于java - 获取对象的单个实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3415942/