【问题标题】:How do I find where an instance of a Java singleton is created?如何找到创建 Java 单例实例的位置?
【发布时间】:2011-12-01 21:01:07
【问题描述】:

在大型、复杂的程序中,发现 代码单例已被实例化。跟踪创建的单例实例以便重用它们的最佳方法是什么?

问候, RR

【问题讨论】:

  • 你想知道哪个调用实例化了单例(假设惰性实例化)?如果是这样,您可以修改单例以在调用构造函数时存储/记录堆栈跟踪。

标签: java singleton instance


【解决方案1】:

Singleton 通常有一个私有构造函数,因此 Singleton 类是唯一可以实例化唯一单例实例的类。

【讨论】:

  • @recolnrelax 您能否添加一个显示您实际操作的 sn-p。 (我不明白“分配给该单例的变量”部分)
  • 我没看错。 “Singleton 类是唯一可以实例化唯一的单例实例的类”我现在明白了:p 抱歉
【解决方案2】:

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 只被调用一次。

【讨论】:

    【解决方案3】:

    我会使用enum

    enum Singleton {
        INSTANCE:
    }
    

    或类似的东西,不能多次实例化并且可以全局访问。

    【讨论】:

      【解决方案4】:

      创建/返回单例的命名方法的一般做法是getInstance()。不明白代码中找不到单例创建的地方的情况,但是可以搜索这个方法名。

      如果您想捕捉单例创建的确切时刻 - 您可以使用AOP。 AspectJ 是 java 中的一个很好的例子。您将能够在创建类或调用getInstance() 方法之前/之后执行您的代码。

      如果您的问题是关于重用已创建的 Singleton,请搜索此站点。 For example

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-06-10
        • 1970-01-01
        • 1970-01-01
        • 2010-11-12
        • 2017-05-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多