小编Gle*_*ane的帖子

如何在访问者模式中使用已检查的异常

假设我有一套接受访问者(访问者模式)的类,但由于这些类或特定访问者的性质,执行它们可能会抛出一个已检查的异常.

访客接受界面:

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)

java exception visitor

16
推荐指数
2
解决办法
1486
查看次数

两个不同的Class实例给出相同的hashCode

我在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 1.6中的行为,现在是1.7.0_80.两者都是Sun Sparc上的32位版本
  • JVM报告-XX:hashCode为"0"

我读到Hotspot中的RNG哈希码生成器("0"策略)如果有赛车线程可以产生重复,但我无法想象类加载会触发该行为.

Hotspot在创建Class实例时是否使用特殊的哈希码处理?

java ognl

10
推荐指数
1
解决办法
484
查看次数

标签 统计

java ×2

exception ×1

ognl ×1

visitor ×1