java重用现有对象

时间:2012-11-06 06:41:29

标签: java object reusability

我可以使用单例模式解决这个问题。但是问题是我无法控制其他应用程序,它将调用新的MyClass()。
我有什么方法可以在MyClass的隐式构造函数中做到吗?。这样的事情。

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

提前致谢。

5 个答案:

答案 0 :(得分:1)

您可以使用枚举:

public enum ClassName {
    INSTANCE;

}

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


  

我可以在MyClass的隐式构造函数中做任何方法吗?。

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

答案 1 :(得分:0)

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

答案 2 :(得分: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

答案 3 :(得分:0)

在班级中创建一个静态变量,并在那里保留object instance。通过getter方法公开您的类对象,如下所示:

  class ClassName {

     private static ClassName myClass= null;

     public ClassName getClassName() {
       if(myClass == null){
         ClassName.myClass = new ClassName();
       }
       return ClassName.myClass;
     }
}

答案 4 :(得分: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实例。