jtulach@169: package org.apidesign.visitor; jtulach@169: jtulach@169: public final class Language { jtulach@170: jtulach@170: private Language() { jtulach@170: } jtulach@170: jtulach@169: public static abstract class Expression { jtulach@170: jtulach@170: Expression() { jtulach@170: } jtulach@170: jtulach@169: public abstract void visit(Visitor v); jtulach@169: } jtulach@170: jtulach@169: public static final class Plus extends Expression { jtulach@170: jtulach@169: private final Expression first; jtulach@169: private final Expression second; jtulach@170: jtulach@169: public Plus(Expression first, Expression second) { jtulach@169: this.first = first; jtulach@169: this.second = second; jtulach@169: } jtulach@170: jtulach@170: public Expression getFirst() { jtulach@170: return first; jtulach@170: } jtulach@170: jtulach@170: public Expression getSecond() { jtulach@170: return second; jtulach@170: } jtulach@170: jtulach@169: @Override jtulach@170: public void visit(Visitor v) { jtulach@266: if (v instanceof Visitor10) { jtulach@266: ((Visitor10) v).visitPlus(this); jtulach@170: } else { jtulach@170: v.visitUnknown(this); jtulach@170: } jtulach@170: } jtulach@169: } jtulach@170: jtulach@169: public static final class Number extends Expression { jtulach@170: jtulach@169: private final int value; jtulach@170: jtulach@170: public Number(int value) { jtulach@170: this.value = value; jtulach@170: } jtulach@170: jtulach@170: public int getValue() { jtulach@170: return value; jtulach@170: } jtulach@170: jtulach@169: @Override jtulach@170: public void visit(Visitor v) { jtulach@266: if (v instanceof Visitor10) { jtulach@266: ((Visitor10) v).visitNumber(this); jtulach@170: } else { jtulach@170: v.visitUnknown(this); jtulach@170: } jtulach@170: } jtulach@169: } jtulach@170: jtulach@169: /** @since 2.0 */ jtulach@169: public static final class Minus extends Expression { jtulach@169: private final Expression first; jtulach@169: private final Expression second; jtulach@169: jtulach@169: public Minus(Expression first, Expression second) { jtulach@169: this.first = first; jtulach@169: this.second = second; jtulach@169: } jtulach@169: public Expression getFirst() { return first; } jtulach@169: public Expression getSecond() { return second; } jtulach@169: jtulach@169: // BEGIN: visitor.cleanversion.dispatch2 jtulach@169: public void visit(Visitor v) { jtulach@266: if (v instanceof Visitor20) { jtulach@266: ((Visitor20)v).visitMinus(this); jtulach@169: } else { jtulach@169: v.visitUnknown(this); jtulach@169: } jtulach@169: } jtulach@169: // END: visitor.cleanversion.dispatch2 jtulach@169: } jtulach@169: jtulach@169: // BEGIN: visitor.cleanversion.v2 jtulach@169: public interface Visitor { jtulach@169: public void visitUnknown(Expression e); jtulach@170: } jtulach@266: public interface Visitor10 extends Visitor { jtulach@169: public void visitPlus(Plus s); jtulach@169: public void visitNumber(Number n); jtulach@169: } jtulach@169: /** @since 2.0 */ jtulach@266: public interface Visitor20 extends Visitor10 { jtulach@169: public void visitMinus(Minus s); jtulach@169: } jtulach@169: // END: visitor.cleanversion.v2 jtulach@169: }