Class VariableProvider


  • public class VariableProvider
    extends Object
    Провайдер значений переменных с механизмом кэширования.

    Используется в StackEvaluator для получения значений переменных (x, y, z и т.д.) во время вычисления выражения. При первом обращении к неизвестной переменной запрашивает ввод через консоль и сохраняет результат в локальный кэш. Повторные обращения к той же переменной возвращают закэшированное значение без запроса ввода.

    Контракт использования:

    • Не является потокобезопасным
    • Метод getVariable(java.lang.String) может блокировать поток ввода-вывода
    • Constructor Detail

      • VariableProvider

        public VariableProvider​(Scanner scanner)
        Создаёт провайдер с кастомным источником ввода.

        Полезно для unit-тестирования, когда необходимо имитировать ввод пользователя без блокировки консоли (например, через ByteArrayInputStream).

        Parameters:
        scanner - источник ввода значений
      • VariableProvider

        public VariableProvider()
        Создаёт провайдер с вводом из стандартного потока (System.in).

        Используется по умолчанию при вычислении выражений с переменными.

    • Method Detail

      • getVariable

        public double getVariable​(String name)
                           throws ExpressionException
        Возвращает значение переменной.

        Алгоритм работы:

        1. Проверяет наличие значения в кэше, то возвращает, если найдено
        2. Если нет, то выводит приглашение в консоль и ожидает ввод числа
        3. Парсит введённое значение, сохраняет в кэш и возвращает
        Parameters:
        name - имя переменной (обычно одна буква: a, b, c, x, y, z etc)
        Returns:
        числовое значение переменной
        Throws:
        ExpressionException - если ввод не является валидным числом, или источник ввода закрыт/исчерпан
      • hasVariable

        public boolean hasVariable​(String name)
        Проверяет, было ли уже запрошено и закэшировано значение переменной.

        Не вызывает блокирующий ввод, только проверяет внутреннее состояние кэша.

        Parameters:
        name - имя переменной
        Returns:
        true если значение присутствует в кэше, иначе false
      • clearCache

        public void clearCache()
        Очищает кэш сохранённых переменных.

        После вызова следующего getVariable(String) для ранее кэшированной переменной снова будет запрошен ввод с консоли.