【发布时间】:2011-12-01 21:01:07
【问题描述】:
在大型、复杂的程序中,发现 代码单例已被实例化。跟踪创建的单例实例以便重用它们的最佳方法是什么?
问候, RR
【问题讨论】:
-
你想知道哪个调用实例化了单例(假设惰性实例化)?如果是这样,您可以修改单例以在调用构造函数时存储/记录堆栈跟踪。
在大型、复杂的程序中,发现 代码单例已被实例化。跟踪创建的单例实例以便重用它们的最佳方法是什么?
问候, RR
【问题讨论】:
Singleton 通常有一个私有构造函数,因此 Singleton 类是唯一可以实例化唯一单例实例的类。
【讨论】:
singleton class 开发人员有责任确保在多次调用中重复使用该实例。
作为用户,您不必担心。
class Singelton
{
private static Singelton _singelton = null;
private Singelton()
{
}
// NOT usable for Multithreaded program
public static Singelton CreateMe()
{
if(_singelton == null)
_singelton = new Singelton();
return _singelton;
}
}
现在,您可以从代码中的任何位置实例化Singelton,您喜欢多少次,每次都将其分配给不同的引用。但是 c'tor 只被调用一次。
【讨论】:
我会使用enum
enum Singleton {
INSTANCE:
}
或类似的东西,不能多次实例化并且可以全局访问。
【讨论】:
创建/返回单例的命名方法的一般做法是getInstance()。不明白代码中找不到单例创建的地方的情况,但是可以搜索这个方法名。
如果您想捕捉单例创建的确切时刻 - 您可以使用AOP。 AspectJ 是 java 中的一个很好的例子。您将能够在创建类或调用getInstance() 方法之前/之后执行您的代码。
如果您的问题是关于重用已创建的 Singleton,请搜索此站点。 For example
【讨论】: