Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何实现@Singleton注释?_Java - Fatal编程技术网

Java 如何实现@Singleton注释?

Java 如何实现@Singleton注释?,java,Java,可能是重复的问题。但我需要实现一些类似于 @Singleton public class Person { } 这将确保Person对象只有一个实例 一种方法是使构造函数私有。但这使得单例注释变得多余 我无法真正理解是否可以在不使构造函数私有的情况下将对象创建限制为单个对象 这可能吗?任何注释都不能阻止类被实例化。但是,如果您计划实现依赖注入框架之类的东西,或者只是一个简单的对象工厂,那么您可以使用反射来读取注释并防止类被多次实例化,但我知道这不是您想要的答案 实际上,您可以考虑放弃单例模式,

可能是重复的问题。但我需要实现一些类似于

@Singleton
public class Person {
}
这将确保Person对象只有一个实例

一种方法是使构造函数私有。但这使得单例注释变得多余

我无法真正理解是否可以在不使构造函数私有的情况下将对象创建限制为单个对象


这可能吗?

任何注释都不能阻止类被实例化。但是,如果您计划实现依赖注入框架之类的东西,或者只是一个简单的对象工厂,那么您可以使用反射来读取注释并防止类被多次实例化,但我知道这不是您想要的答案

实际上,您可以考虑放弃单例模式,转而使用更现代的解决方案,如适当的DI框架,这可以给您带来相同的结果——更灵活

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

    }

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

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

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

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");
   }
}

非常确定您必须将构造函数设置为私有。任何注释都无法阻止公众对事物的关注constructor@gd1可能需要,也可能不需要。最好提一下。:)@gd1是否有一种线程安全的单例的通用方法?或者它真的是基于每个实现的吗?首先使
getInstance()
同步?不一定。您可以在类初始化时立即初始化实例(这保证是线程安全的),或者,如果您坚持延迟初始化,则必须使实例引用可变(Java 1.5+)并执行双重检查锁定。看见然而,这似乎太过时了:有好的DI框架,它们支持单例对象。最值得注意的是,它们可以随时变为非单例,而无需更改一行代码。在很多情况下,一个简单的单例就可以解决问题。这里需要开明一点,谢谢。我认为DI是另一种选择。但是在那里,容器只是返回相同的bean实例,而不是每次调用getBean方法时都创建它。我认为任何人都可以用new来实例化这个类。如果类的契约包含它,那么就不应该直接实例化它,那么你不一定需要用一些编程技巧来强制实现它。如果客户想违反你的合同,让他/她这样做并承担后果。你说得够清楚了,用谷歌浏览器,