public abstract class Expression {
    private int value;
    private boolean evaluated = false;
    public int getValue() { 
        if (!evaluated) {
            value = evaluate();
            evaluated = true;           
        }
        return value;
    }
    abstract protected int evaluate();

    public static void main(String[] args) {
        Expression e = new Add(
            new Neg (new Const(8)),
            new Const(16));
        System.out.println(e.getValue());
    }
} // end of class Expression
