给定一个对象,我们如何检查一个类是否是Singleton?
目前我正在使用此
public class SingletonClass implements IsSingleton
其中IsSingleton
是我在单例类上实现的空白接口。因此,该类可以作为单例进行测试
SingletonClass obj = SingletonClass.getInstance();
if(obj instanceof IsSingleton)
System.out.println("Class is Singleton");
else
System.err.println("Class not singleton");
有没有更好的方法来确定Singleton类。我已经尝试了reflection
,但问题是getConstructors()
仅返回声明的公共类。所以它会将没有声明构造函数的类视为Singleton。
答案 0 :(得分:4)
Singleton是一个语义定义,通常不能通过代码测试。没有任何接口或任何其他方案可以保证该类仅作为单身操作。
由于这个(语义性质),创建自定义注释以指示此功能会更好IMO
答案 1 :(得分:2)
没有一般方法可以通过编程方式了解某个类是否是单例。
答案 2 :(得分:2)
我认为这可能对你有帮助.... 每当在内存中创建任何对象时,总会存在与之关联的哈希码。这个哈希码是通过使用少量参数的数学运算来计算的,例如启动内存分配地址。因此,如果你将在任何对象上多次调用hashcode(),它将返回相同的哈希码。 因此,只需调用返回预期单例类型对象的方法,并在其上调用hashcode()方法。如果它每次打印相同的哈希码,则表示它是单例,否则不是。
很多人都说instanceof关键字可以帮助决定一个对象是否是单例。但是,我真的不明白这怎么可能? instanceof只是让我们检查实例是否属于任何特定的类。因此,如果有多个A类实例并且它们不是由单例模式创建的,那么检查其中任何一个的instanceof总是会返回true。但是,它不能被称为单例,因为存储器中的每个对象都存在单独的实例。
答案 3 :(得分:1)
这看起来很复杂。
Java支持“instanceof”
SingletonClass obj = SingletonClass.getInstance();
if(obj instanceof IsSingleton)
System.out.println("Class is Singleton");
else
System.err.println("Class not singleton");
答案 4 :(得分:1)
instanceof应该可以使用接口。
SingletonClass obj = SingletonClass.getInstance();
if (obj instanceof IsSingleton)
System.out.println("Yay !");
但要小心!
http://www.xyzws.com/Javafaq/how-does-instanceof-work-with-interface/67
如果对象来自最终类,如String,则无效。对于你的自定义类,只要你不让这个类本身最终,它应该没问题。