我只是偶然发现this question使用==
与.equals()
比较枚举值。共同的同意是,使用==
是绝对可以的,因为一次只能存在一个枚举常量。这也是我的第一个想法。
但是:如何使用两个(或更多)ClassLoader加载同一个类。不一定是枚举类。任何包含静态常量的类。
想象一下:
class ContainsConstants {
public static final Object DEMO_CONSTANT = new Object();
}
让我们从另一个类中引用这个值:
class Pojo {
public final Object myField = ContainsConstants.DEMO_CONSTANT;
}
现在使用clazz.newInstance()
创建两个Pojo实例,其中clazz由不同的ClassLoader加载,并将myField
相互比较并与ContainsConstants.DEMO_CONSTANT
进行比较:
Thread.currentThread().setContextClassLoader(classLoader1);
Pojo pojo1 = instantiatePojoReflectivelyFromClassLoadedBy(classLoader2);
Pojo pojo2 = instantiatePojoReflectivelyFromClassLoadedBy(classLoader3);
if (pojo1.myField == pojo2.myField) {
// what happens?
}
if (ContainsConstants.DEMO_CONSTANT == pojo1.myField) {
// what happens?
}
问题:这两个领域是否相同?如果没有,equals方法是否会解决这个问题,因为它可能会在内部使用静态内容(比如字符串)?