4

给定一个对象,我们如何检查一个类是否是单例类?

目前我正在使用这个

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

有没有更好的方法来确定单例类。我已经尝试过了,reflection但问题是getConstructors()只返回声明的公共类。因此,它会将没有声明构造函数的类视为 Singleton。

4

5 回答 5

5

我认为这可能会对您有所帮助.... 每当在内存中创建任何对象时,总会有一个与之关联的哈希码。该哈希码是通过使用少量参数(例如起始内存分配地址)的数学运算计算得出的。因此,如果您对任何对象调用 hashcode() 任意次数,它将返回相同的哈希码。因此,只需调用返回您预期的单例类型对象的方法并在其上调用 hashcode() 方法。如果每次都打印相同的哈希码,则表示它是单例的,否则不是。

很多人都说 instanceof 关键字可以帮助你判断一个对象是否是单例的。但是,我真的不明白这怎么可能?instanceof 只是让我们检查实例是否属于任何特定类。因此,如果有多个类 A 的实例并且它们不是由单例模式创建的,那么检查它们中的任何一个的 instanceof 总是会返回 true。但是,它不能被称为单例,因为内存中的每个对象都存在单独的实例。

于 2012-05-18T19:41:05.483 回答
5

单例是一种语义定义,通常不能通过代码进行测试。没有接口或任何其他方案可以保证该类仅作为单例运行。

因此(语义性质),IMO 最好创建一个自定义注释来指示此功能

于 2012-05-18T16:50:00.107 回答
2

没有通用的方法可以以编程方式知道一个类是否是单例。

于 2012-05-18T16:45:09.473 回答
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),这将不起作用。对于您的自定义类,只要您不使类本身成为最终类,就可以了。

于 2012-05-18T16:46:57.193 回答
0

这看起来很复杂。

Java 支持“instanceof”

SingletonClass obj = SingletonClass.getInstance();
if(obj instanceof IsSingleton)
    System.out.println("Class is Singleton");
else
    System.err.println("Class not singleton");
于 2012-05-18T16:45:01.090 回答