Java 如何从对象中查找类是否为单例类?

Java 如何从对象中查找类是否为单例类?,java,singleton,Java,Singleton,给定一个对象,我们如何检查一个类是否是单例的 目前我正在使用这个 public class SingletonClass implements IsSingleton 其中,IsSingleton是我在singleton类上实现的一个空白接口。因此,该类可以作为单例进行测试 SingletonClass obj = SingletonClass.getInstance(); if(obj instanceof IsSingleton) System.out.println("Class

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

目前我正在使用这个

public class SingletonClass implements IsSingleton
其中,
IsSingleton
是我在singleton类上实现的一个空白接口。因此,该类可以作为单例进行测试

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

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

这看起来非常复杂

Java支持“instanceof”


没有通用的方法可以通过编程知道类是否为单例。

instanceof应该与接口一起使用

SingletonClass obj = SingletonClass.getInstance();

if (obj instanceof IsSingleton)
    System.out.println("Yay !");
但是要小心


如果对象来自最终类(如字符串),则此操作将不起作用。对于自定义类,只要不使类本身成为最终类,就可以了。

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


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

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


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

我不是java专家,但如果有一种方法可以通过编程测试对象的构造函数是否私有(可能是通过反射),那就是我测试它的方法。@Kristian-有一种方法可以测试它,但是私有构造函数不能保证类是单例的。您仍然可以通过所述对象上的静态方法构造任意数量的对象。拥有私有构造函数并不一定意味着该类是作为单例实现的。如果您所有的单例都要实现
IsSingleton
接口,那么是的,这是一种更准确的方法来实现您想要的功能,如果类遵循接口的约定。但是一个类仍然可以打破你的接口契约,做自己的事情而不是成为一个单体。你可能想用一个抽象类来代替它。请问你为什么想知道它是不是一个单例类?很有可能有一种更“Java-y”的方式来看待这个问题。
SingletonClass obj = SingletonClass.getInstance();

if (obj instanceof IsSingleton)
    System.out.println("Yay !");