Использование значений enum для представления бинарных операторов или функций - PullRequest
0 голосов
/ 11 марта 2010

Я ищу элегантный способ использования значений в перечислении Java для представления операций или функций. Я предполагаю, что, поскольку это Java, просто не будет хорошего способа сделать это, но в любом случае. Мой enum выглядит примерно так:

public enum Operator {
    LT,
    LTEQ,
    EQEQ,
    GT,
    GTEQ,
    NEQ;

    ...
}

, где LT означает < (меньше чем), LTEQ означает <= (меньше или равно) и т. Д. - вы поймете идею. Теперь я хочу использовать эти значения перечисления для применения оператора. Я знаю, что мог бы сделать это, просто используя целую кучу операторов if, но это уродливо, ОО, например ::100100

int a = ..., b = ...;
Operator foo = ...; // one of the enum values
if (foo == Operator.LT) {
    return a < b;
}
else if (foo == Operator.LTEQ) {
    return a <= b;
}
else if ... // etc

То, что я хотел бы сделать, это вырезать эту структуру и использовать некую первоклассную функцию или даже полиморфизм, но я не совсем уверен, как. Что-то вроде:

int a = ..., b = ...;
Operator foo = ...;
return foo.apply(a, b);

или даже

int a = ..., b = ...;
Operator foo = ...;
return a foo.convertToOperator() b;

Но, насколько я видел, я не думаю, что можно вернуть оператор или функцию (по крайней мере, без использования сторонней библиотеки). Есть предложения?

Ответы [ 2 ]

3 голосов
/ 11 марта 2010

Это не только возможно, но и используется в качестве примера в часто упоминаемой Effective Java, Second Edition, Josh Bloch . Я не хочу наступать на его авторские права, поищу аналогичный пример в сети ...

Хорошо, код, который я запомнил, свободно доступен на сайте, на который я ссылался ранее. Нажмите «Скачать примеры кода, используемые в этой книге», затем посмотрите на effective2/examples/Chapter6/Item30/Operation.java.

0 голосов
/ 11 марта 2010
int a = ..., b = ...;
Operator foo = ...;
return foo.apply(a, b);

это можно сделать, если foo - объект, а оператор - базовый класс, а конкретные операторы - это конкретные классы, которые реализуют.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...