訪問者パターンを使用して、プロキシされたインスタンスの背後にあるランタイム クラスを把握しようとして、休止状態を扱っていました。そこで、あるアプローチを思いついたの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
を継承するが作成されます。C++ では、 AbstractVisitableでは ではなくを参照する可能性があるため、これは危険であると考えます。特定の状況下でコードが出力されるのではないかと心配していました。しかし、上記のコードは を出力しますが、実際の型を動的プロキシの背後に隠しています (これは私が思いつくことができる最も困難なケースです)。上記の抽象的なビジター アプローチは動作することが保証されていますか、それともこのアプローチにはいくつかの落とし穴がありますか?accept
AbstractVisitable
this
AbstractVisitable::this
ConcreteVisitable::this
class AbstractVisible
class ConcreteVisitable
this
ポインタに関してJavaでどのような保証が与えられていますか?