如何实现@Singleton注释?

use*_*472 19 java

可能是一个重复的问题.但我需要实现类似的东西

@Singleton
public class Person {
}
Run Code Online (Sandbox Code Playgroud)

这将确保只有Person对象的单个实例.

一种方法是使构造函数私有化.但这使Singleton注释变得多余.

我真的无法理解我是否真的可以将对象创建限制为单个对象而不会使构造函数变为私有.

这甚至可能吗?

gd1*_*gd1 22

没有注释可以阻止实例化类.但是,如果您计划实现类似依赖注入框架的东西,或者只是一个简单的对象工厂,那么您可以使用反射来读取注释并防止类被多次实例化,但我明白这不是您的答案正在寻找.

您实际上可以考虑放弃单例模式并转移到更合适的DI框架之类的更现代的解决方案,这可以为您提供相同的结果 - 具有更大的灵活性.

  • 如果类的合同包含它不应该直接实例化,那么你不一定需要用一些编程技巧来强制执行.如果客户想要违反您的合同,请让他/她这样做并支付后果.你很清楚. (2认同)

Cru*_*her 11

public class ASingletonClass
{
    private static ASingletonClass instance = null;
    private ASingletonClass()
    {

    }

    public static ASingletonClass getInstance()
    {
        if(instance==null)
        {
             instance = new ASingletonClass();
        }
        return instance;
    }
}
Run Code Online (Sandbox Code Playgroud)

这是实现单例的正确方法.注释不能阻止人们调用公共构造函数.

  • 有时DI太多了.在许多情况下,简单的Singleton解决了这个问题.需要在这里保持开放的态度. (3认同)
  • 不必要.您可以在类初始化后立即初始化实例(保证是线程安全的),或者,如果您坚持使用延迟初始化,则必须使实例引用为volatile(Java 1.5+)并执行双重检查锁定.请参见http://en.wikipedia.org/wiki/Double-checked_locking.然而,这似乎已经过时了:那里有很好的DI框架,它们支持单例对象.最值得注意的是,它们可以在不改变代码行的情况下随时转为非单例. (2认同)