23

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

@Singleton
public class Person {
}

这将确保只有一个 Person 对象实例。

一种方法是将构造函数设为私有。但这使得 Singleton 注释变得多余。

我真的不明白我是否真的可以在不将构造函数设为私有的情况下将对象创建限制为单个对象。

这甚至可能吗?

4

3 回答 3

24

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

您实际上可以考虑放弃单例模式并转向一些更现代的解决方案,例如适当的 DI 框架,它可以为您提供相同的结果 - 具有更大的灵活性。

于 2013-09-13T20:56:14.940 回答
11
public class ASingletonClass
{
    private static ASingletonClass instance = null;
    private ASingletonClass()
    {

    }

    public static ASingletonClass getInstance()
    {
        if(instance==null)
        {
             instance = new ASingletonClass();
        }
        return instance;
    }
}

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

于 2013-09-13T20:58:07.580 回答
0

您还可以使用类的延迟初始化。示例代码如下。

class LazyInitialization implements PrintStatement {
   private static LazyInitialization instance;

   private LazyInitialization() {

   }

   static LazyInitialization getInstance() {
     if (instance == null)
        instance = new LazyInitialization();

     return instance;
   }

   @Override
   public void print() {
      System.out.println("I am inside");
   }
}
于 2018-10-26T11:50:21.493 回答