如何实现@Singleton注释?
可能是一个重复的问题。 但我需要实现类似的东西
@Singleton public class Person { }
这将确保只有Person对象的单个实例。
一种方法是将构造函数设为私有。 但这使Singleton注释变得多余。
我无法理解我是否真的可以将对象创建限制为单个对象而不会使构造函数变为私有。
这有可能吗?
没有注释可以阻止实例化类。 但是,如果您计划实现类似dependency injection框架或简单对象工厂之类的东西,那么您可以使用reflection来读取注释并防止类被多次实例化,但我明白这不是您的答案正在寻找。
您实际上可以考虑放弃单例模式并转向更现代的解决方案,例如适当的DI框架,它可以为您提供相同的结果 – 具有更大的灵活性。
public class ASingletonClass { private static ASingletonClass instance = null; private ASingletonClass() { } public static ASingletonClass getInstance() { if(instance==null) { instance = new ASingletonClass(); } return instance; } }
这是实现单例的正确方法。 注释不能阻止人们调用公共构造函数。
示例@Singletone
模式实现是线程安全的 :
public class SomeDataSource { private static volatile SomeDataSource INSTANCE; // Prevent direct instantiation. private SomeDataSource() { // Leave it empty or implement any logic needed } public static SomeDataSource getInstance() { if (INSTANCE == null) { synchronized (SomeDataSource.class) { if (INSTANCE == null) { INSTANCE = new SomeDataSource(); } } } return INSTANCE; } // Implement some logic }
然后只需使用此代码即可获得Singletone并确保安全:
SomeDataSource dataSource = SomeDataSource.getInstance();
此示例显示将处理对数据库的访问的类(为简洁起见,省略了逻辑)
或者您可以使用一些dependency injection库。 Dagger2例如:
@Provides @Singleton static Heater provideHeater() { return new ElectricHeater(); }