如何从对象中查找一个类是否是单例类?

Nit*_*jer 4 java singleton

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

目前我正在使用这个

public class SingletonClass implements IsSingleton
Run Code Online (Sandbox Code Playgroud)

其中IsSingleton是我在单例类上实现的空白接口。所以这个类可以作为单例进行测试

SingletonClass obj = SingletonClass.getInstance();
if(obj instanceof IsSingleton)
    System.out.println("Class is Singleton");
else
    System.err.println("Class not singleton");
Run Code Online (Sandbox Code Playgroud)

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

Sum*_*sai 6

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

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


Con*_*Del 5

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

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