我想设计一个应该返回某个第三方对象的单例的类。 例如,我想创建一个第三方B类对象的单例。以下是我的设计。
public class A{
private static A A = null;
private static B B = null;
private A() {
B = code to instantiate B Object;
}
public static synchronized A getAInstance() {
if(A ==null){
synchronized(A.class){
if(A == null){
A = new A();
}
}
}
return A;
}
public B getB(){
return B;
}
}
请帮助我,这是一个合适的单身人士
答案 0 :(得分:0)
如果我正确理解您的问题,您希望拥有第三方类的单个实例。首先,通过包装类obj(敏捷软件工艺第8章的清洁代码手册)访问第三方obj是一个很好的做法,在你的情况下,类b由类a包装。 为了创建类b的单个实例,你可以将它作为类a的实例变量,然后使类成为单例,代码如下:
Public class A{
private static A A = null;
private B B = null;
private A() {
B = code to instantiate B Object;
}
public static synchronized A getAInstance() {
if(A ==null){
synchronized(A.class){
if(A == null){
A = new A();
}
}
}
return A;
}
public B getB(){
return B;
}
}
答案 1 :(得分:0)
你可以简单地拥有这种结构。不需要显式同步,只需将其留给JVM。
public class A {
private static class BInstanceHolder {
B BInstance = new B();
}
private A(){}
public static B getB(){
return BInstanceHolder.BInstance;
}
}
答案 2 :(得分:0)
如果你只想要一份B副本,就这样做吧! 你甚至不需要A级单身人士。 所以你可以试试:
public final class A{
private A(){}
private static B instance;
static{
instance = code to instantiate B Object
}
public static synchronized B getInstance() {
return B;
}
}
静态块将在首次提到Class时创建B的实例,并将实例化该实例。构造函数将阻止创建A,但您仍然可以访问B的唯一实例。