package espressioni;

public class EspressioneVariabile extends EspressioneIntera {

// una espressione variabile conteine solo una variabile,
// che in questo caso e' data solo da una stringa; se il
// testo avesse specificato che esisteva la classe Variabile,
// questa variabile d'istanza averebbe avuto tipo Variabile

// private per via dell'incapsulamento

  private String var;

// costruttore; non e' necessario replicare l'oggetto dato
// che non e' modificabile

  public EspressioneVariabile(String s) {
    if(null==s)
      throw new RuntimeException("Tentativo creazione EspressioneVariabile con stringa nulla");

    this.var=s;
  }

// stessa cosa per il metodo get

  public String getVar() {
    return var;
  }

// toString: qui possiamo essere sicuri che la variabile non
// sia null

  public String toString() {
    return var.toString();
  }

// equals: qui sfruttiamo: 1. il metodo stessaClasse
// ereditato; 2. il fatto che var non e' null; 3. il fatto
// che le stringhe hanno un metodo equals

  public boolean equals(Object o) {
    if(!this.stessaClasse(o))
      return false;

    EspressioneVariabile v=(EspressioneVariabile) o;

    return this.var.equals(v.var);
  }

// se si ridefinisce equals va ridefinito anche hashCode

  public int hashCode() {
    return this.var.hashCode();
  }

// clone non e' necessario: dato che le stringhe non sono
// clonabili, basta la clonazione superficiale; questa e'
// gia' ereditata dalla sovraclasse
}

