public boolean equals(Object object) {
    if (!(object instanceof Expression)) {
      return false;
    }

    Expression e = (Expression) object;

    if (e.getType() != getType() || e.getOperandCount() != getOperandCount()) {
      return false;
    }

    // compare operands
    int len = e.getOperandCount();
    for (int i = 0; i < len; i++) {
      if (!Util.nullSafeEquals(e.getOperand(i), getOperand(i))) {
        return false;
      }
    }

    return true;
  }