Java Based Expression Evaluator

Мне нужен Expression Evaluator, который может позволить мне оценить выражение, такое как:

(ItemWeight + PackageWeight) * 2

Итак, учитывая следующий вход:

ItemWeight = new Weight(2.0, LBS);
PackageWeight = new Weight(0.2, LBS);

Выход будет: Weight(4.4, LBS)

public class Weight {
   private final float value;
   private final Unit unit;

   public float getValue() { return value; }
   public Unit getUnit() { return unit; }

   public enum Unit {
       LB, KG, GRAMS;
   }
}

Точно так же я хотел бы добавить / вычесть два объекта Amount (где сумма состоит из значения и символа валюты).

Примечание. В моем случае это нормально, если предположить, что два значения, которые не имеют одинаковую единицу, не могут быть добавлены / вычтены и т. Д.

Я читал о MVEL, но, похоже, MVEL не сможет обрабатывать арифметические выражения с использованием POJO. Другие варианты, которые пришли на ум, это Rhino и Commons EL.

Какой будет хорошая библиотека, которую я могу использовать (и при необходимости расширить) для решения этой проблемы?

Спасибо!

1 ответ

Ява не С ++; Вы не можете перегружать операторов.

Это может показаться не столь привлекательным для визуального использования, используя свободный интерфейс, но я бы сказал, что это проще, чем то, что вы предлагаете.

Это интересно, потому что вам придется думать не только об EL. Идея гораздо более общая, чем ваша Weight учебный класс. Это больше похоже QuantityWithUnits, Вот несколько вопросов, на которые вам нужно ответить:

  1. Как вы будете запрещать операции сложения и вычитания для объектов с разными единицами измерения?
  2. Как вы будете учитывать создание новых юнитов при делении и умножении?
  3. Вы позволите скалярное умножение и деление?
  4. Запретите ли вы добавление скаляров к количествам с единицами измерения? Или вы будете молча создавать новые объекты с такими же единицами за кулисами?
  5. Будут ли у вас другие обычные физические операции, такие как полномочия?
  6. Как вы будете работать с системами юнитов и конверсий?

Вы можете подумать: "Я слишком умен для всего этого; я просто хочу сделать что-то" простое и практичное "", но в конечном итоге вам придется ответить на все это.

Другие вопросы по тегам