假设我有一套接受访问者(访问者模式)的类,但由于这些类或特定访问者的性质,执行它们可能会抛出一个已检查的异常.
访客接受界面:
public interface Mammal
{
void accept(MammalVisitor visitor);
}
Run Code Online (Sandbox Code Playgroud)
访客界面:
public interface MammalVisitor
{
void visit(Cat m);
void visit(Dog m);
void visit(Cow m);
}
Run Code Online (Sandbox Code Playgroud)
哺乳动物的实施:
public class Cat implements Mammal
{
public void accept(MammalVisitor visitor)
{
visitor.visit(this);
}
}
Run Code Online (Sandbox Code Playgroud)
我们假设Dog&Cow的实现与Cat相同
现在假设我的访客是:
public class MammalPrinter implements MammalVisitor
{
private final Appendable out;
public MammalPrinter(Appendable out)
{
this.out = out;
}
@Override
public void visit(Cat m)
{
out.append("I'm a cat");
}
@Override
public void visit(Dog m)
{
out.append("I'm a dog");
} …Run Code Online (Sandbox Code Playgroud) 我在JBoss服务器上遇到了一个奇怪的问题,其中两个类正在生成相同的问题hashCode().
Class<?> cl1 = Class.forName("fqn.Class1");
Class<?> cl2 = Class.forName("fqn.Class2");
out.println(cl1.getCanonicalName());
out.println(cl2.getCanonicalName());
out.println(cl1.hashCode());
out.println(cl2.hashCode());
out.println(System.identityHashCode(cl1));
out.println(System.identityHashCode(cl2));
out.println(cl1 == cl2);
out.println(cl1.equals(cl2));
out.println(cl1.getClassLoader().equals(cl2.getClassLoader()));
Run Code Online (Sandbox Code Playgroud)
生产:
fnq.Class1
fnq.Class2
494722
494722
494722
494722
false
false
true
Run Code Online (Sandbox Code Playgroud)
我通常不会关心,但我们正在使用一个框架,该框架使用由类中的哈希码和属性名称组成的密钥来缓存setter.这对于缓存来说是一个糟糕的设计,但目前我无法控制(最新的Struts 2.3.24中的OGNL 3.0.6,请参阅源代码.较新的OGNL修复了这个问题,但它目前不会在Struts中使用2.5,目前在测试中.)
是什么让这个问题对我来说有点奇怪
我读到Hotspot中的RNG哈希码生成器("0"策略)如果有赛车线程可以产生重复,但我无法想象类加载会触发该行为.
Hotspot在创建Class实例时是否使用特殊的哈希码处理?