1

我可以使用单例模式解决这个问题。但问题是我无法控制其他将调用 new MyClass() 的应用程序。
我可以在 MyClass 的隐式构造函数中做些什么吗?
像这样的东西。

class ClassName {
    public ClassName() {
        if( object exist for ClassName)
            return that
        else
            create New ClassName object
    }
}

提前致谢。

4

5 回答 5

1

您可以使用枚举:

public enum ClassName {
    INSTANCE;

}

现在,您有一个实例,您不必担心其他人实例化您的类。


我可以在 MyClass 的隐式构造函数中做些什么吗?

不,这不能在构造函数中完成。

于 2012-11-06T06:53:00.380 回答
0

如果要控制构造,请放入显式构造函数并将其声明为私有。您可以从类中的静态工厂方法调用它。

于 2012-11-06T06:47:07.657 回答
0

这可能是你想要的:

public class MySingletonClass {
    private static MySingletonClass instance = null;
    private MySingletonClass() { }
    public static MySingletonClass getInstance() {
       if (instance == null) {
           instance = new MySingletonClass();
       }
       return instance;
    }
    // add your methods here.
}

这样没人能打电话new MySingletonClass();。要获取对象的唯一实例,您必须编写:

MySingletonClass msc = MySingletonClass.getInstance();

或以某种方式将其用于void方法:

MySingletonClass.getInstance().yourMethod();

或者对于具有返回类型的方法是这样的:

VariableType foo = MySingletonClass.getInstance().yourMethod(); // Must return VariableType
于 2012-11-06T06:50:20.693 回答
0

在您的类中创建一个静态变量并保持在object instance那里。通过以下getter方法公开您的类对象:

  class ClassName {

     private static ClassName myClass= null;

     public ClassName getClassName() {
       if(myClass == null){
         ClassName.myClass = new ClassName();
       }
       return ClassName.myClass;
     }
}
于 2012-11-06T06:50:39.680 回答
0

你需要这样的东西:

class ClassName {

private static ClassName INSTANCE;

private ClassName() {
    //create ClassName object
}

public static ClassName getInstance(){
if (INSTANCE == null){
    INSTANCE = new ClassName();
} 

return INSTANCE;
}

}

这只是单例模式的基本实现。

如果构造对象的类必须使用 构造它new,那么你有点搞砸了。在 Java 中,仅使用公共构造函数确实没有办法实现单例模式。

编辑:你也许可以做这样的事情:

class ClassNameWrapper extends ClassName {

private final ClassName className;

public ClassNameWrapper(){
    className = ClassName.getInstance();
}

//overload methods from ClassName

}

这样,每次调用new ClassNameWrapper()都将使用同一个 ClassName 实例。

于 2012-11-06T06:52:53.540 回答