gpt4 book ai didi

Java 抽象访问者 - 保证成功吗?如果是这样,为什么?

转载 作者:行者123 更新时间:2023-12-02 08:32:13 25 4
gpt4 key购买 nike

我正在处理 hibernate ,试图通过使用访问者模式找出代理实例背后的运行时类。然后我想出了一个 AbstractVisitable 方法,但我想知道它是否总是会产生正确的结果。

考虑以下代码:

interface Visitable {
public void accept(Visitor v);
}

interface Visitor {
public void visit(Visitable visitorHost);
}

abstract class AbstractVisitable implements Visitable {
@Override
public void accept(Visitor v) {
v.visit(this);
}
}

class ConcreteVisitable extends AbstractVisitable {
public static void main(String[] args) {
final Visitable visitable = new ConcreteVisitable();
final Visitable proxyVisitable = (Visitable) Proxy.newProxyInstance(
Thread.currentThread().getContextClassLoader(),
new Class<?>[] { Visitable.class }, new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method,
Object[] args) throws Throwable {
return method.invoke(visitable, args);
}
});
proxyVisitable.accept(new Visitor() {
@Override
public void visit(Visitable visitorHost) {
System.out.println(visitorHost.getClass());
}
});
}
}

这使得 ConcreteVisitable 继承了 AbstractVisitableaccept 方法。在 C++ 中,我认为这是有风险的,因为 AbstractVisitable 中的 this 可能引用 AbstractVisitable::this,而不是 ConcreteVisitable::this。我担心代码在某些情况下会打印class AbstractVisible。然而,上面的代码输出 class ConcreteVisitable,即使我将真实类型隐藏在动态代理后面(这是我能想到的最困难的情况)。上面的抽象访问者方法是否保证有效,或者这种方法是否存在一些陷阱?

Java 中对 this 指针给出了哪些保证?

最佳答案

正如您可能猜到的那样,

this 始终指向此对象。您在层次结构中使用哪种类型是无关紧要的,除非您使用它来引用非虚拟事物(例如私有(private)字段/方法,或者上帝禁止的静态方法)。 getClass() 是虚拟的。

现在我预计您可能会混淆 this 的行为,认为 Java 具有多重分派(dispatch)。事实并非如此。如果您将访问者更改为:

class Visitor {
public void visit(Visitable visitorHost);
public void visit(ConcreteVisitable visitorHost);
}

然后像这样实现它:

public void visit(Visitable visitorHost) { 
System.out.println("Visitable");
}
public void visit(ConcreteVisitable visitorHost) {
System.out.println("ConcreteVisitable");
}

它确实会打印“Visitable”,而不是“ConcreteVisitable”,因为 Java 不执行 double dispatch .

关于Java 抽象访问者 - 保证成功吗?如果是这样,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3037840/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com