如何查找某个类是否是该对象的单例类?

时间:2012-05-18 16:42:44

标签: java singleton

给定一个对象,我们如何检查一个类是否是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。

5 个答案:

答案 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,则无效。对于你的自定义类,只要你不让这个类本身最终,它应该没问题。