Сложите числа со словом add

Я пишу, чтобы предложить приложение на Java прямо сейчас, и вместо использования оператора «+» пользователь приложения может буквально использовать слово «добавить», чтобы сложить два числа вместе.

Я совершенно не понимаю, как это сделать, потому что я не могу использовать метод для завершения функции, учитывая, что мне нужно будет ввести «добавить ()», а не просто «добавить». Если нет способа выполнить метод без круглых скобок. Придется ли мне писать совершенно новый класс или есть более простой способ сделать это?


person Twisterz    schedule 19.08.2012    source источник
comment
С какой стати вам хотеть это делать?   -  person Jeffrey    schedule 19.08.2012
comment
Я буквально просто хочу попробовать что-то другое, мне нравится заставлять себя думать.   -  person Twisterz    schedule 19.08.2012
comment
@Twisterz Самое близкое к этому поведению в Java — это написать собственный метод, который будет принимать два аргумента и оператор и вычислять результат. Я бы не советовал этого, потому что это быстро станет громоздким, неэффективным и запутанным.   -  person Jeffrey    schedule 19.08.2012
comment
@Twisterz Не в Java, но взгляните на Scala, если вы хотите определить свои собственные буквенно-цифровые инфиксные операторы. Можно ли сделать это на существующих классах, таких как Int, хороший вопрос для изучения, заставляющий себя думать.   -  person Ray Toal    schedule 19.08.2012
comment
в кодировании нет никакой причины (помимо того факта, что вы не можете этого сделать) делать это, однако вы можете сделать это в пользовательском интерфейсе. Например, если пользователь вводит два числа и слово добавляет 1, добавляет 2, то вы может искать в строке слово add, и если оно есть, вы вызываете функцию add(x,y)... что-то в этом роде   -  person user710502    schedule 19.08.2012
comment
@RayToal Это хороший момент, о котором я не подумал, мне придется изучить   -  person Twisterz    schedule 19.08.2012
comment
@user710502 user710502 На самом деле это неплохая идея.   -  person Twisterz    schedule 19.08.2012
comment
@ user710502 Я бы поместил всю логику в ScriptEngine. Смотрите мой ответ.   -  person Andrew Thompson    schedule 19.08.2012
comment
@Jeffrey Кажется, это приближается к тому, чтобы «предложить возможность конечному пользователю». Так гораздо понятнее.   -  person Andrew Thompson    schedule 19.08.2012
comment
Боже, есть много хороших ответов, я, честно говоря, не знаю, какой выбрать...   -  person Twisterz    schedule 19.08.2012
comment
Выберите то, что вы считаете лучшим. Но лучше оставить хотя бы на сутки. После всего. Там может быть больше ответов прямо за углом. Дайте нам знать, как вы идете. :)   -  person Andrew Thompson    schedule 19.08.2012
comment
Кстати, я внес существенное редактирование на основе комментариев к вопросу, пожалуйста, просмотрите мои изменения и отмените их, если они неверны. Если все верно, вы можете отредактировать курсив. ;)   -  person Andrew Thompson    schedule 19.08.2012


Ответы (4)


(Расширение идеи, представленной пользователем 710502)

Вы можете использовать отражение.

double a = Double.parseDouble(some user input);
double b = Double.parseDouble(some user input);
String operation = some user input; // i.e. "add", "subtract"
Method operator = Calculations.class.getMethod(operation, double.class, double.class);
// NoSuchMethodException is thrown if method of operation name isn't found
double result = (Double) operator.invoke(null, a, b);

В каком-то классе вычислений:

public static double add(double a, double b) {
    return a + b;
}

public static double subtract(double a, double b) {
    return a - b;
}

// and so forth
person FThompson    schedule 19.08.2012
comment
Это очень интересно и отличный ответ, спасибо, что поделились! - person Twisterz; 19.08.2012
comment
Для дальнейшего чтения по размышлению, java.sun.com/developer/technicalArticles/ALT/Reflection - person FThompson; 19.08.2012

Просто небольшое объяснение того, что вы можете сделать, основываясь на том, что вводит пользователь:

int x = get it from the user;
int y = get it from the user;
string operation = get it from the user;
  • Создайте отдельные методы для операций (i.e add(int x, int y), multiply(int x, int y), etc..)

Затем создайте метод, который получает значения (x, y, string), скажем... вы можете назвать его calculate(int x, int y, string operation)

Затем в методе расчета есть оператор switch:

switch(operation)
{
case "add":
      add(x,y);
      break;
case "multiply":
      multiply(x,y);
      break;
etc...
}

Что ж, есть над чем подумать :).

person user710502    schedule 19.08.2012
comment
Это можно еще больше упростить, используя отражение. Вместо того, чтобы иметь случай для каждого метода с тем же именем, метод может быть вызван с x и y в качестве параметров. Я написал эту концепцию как ответ ранее (она все еще существует в поле для ответов, если кому-то интересно), но не опубликовал ее, потому что я перечитал вопрос и решил, что это плохой ответ. - person FThompson; 19.08.2012
comment
Мне интересно это увидеть @Vulcan - person Twisterz; 19.08.2012
comment
@ Вулкан, да, чувак, выложи это.. я просто дал представление о том, что можно сделать.. и ни в коем случае не думал об оптимизации.. но если ты тот парень... было бы круто :) - person user710502; 19.08.2012
comment
@user710502 user710502 Это может быть не оптимизация с точки зрения скорости (отражение занимает больше времени для выполнения, чем оператор switch, если я правильно помню, но разница незначительна). Однако это упрощает код и упрощает реализацию новых операторов. - person FThompson; 19.08.2012

В Java это сделать невозможно. У вас есть два варианта:

1) Используйте препроцессор. 2) Напишите это на другом языке. Вы можете писать что-то на других языках и при этом иметь совместимость с классами и библиотеками Java.

person Antimony    schedule 19.08.2012

Консенсус в комментариях, похоже, таков: «Зачем вам это делать? Это медленно и громоздко». Хотя последняя часть верна, это обычно делается. См. в качестве примера ScriptEngine. Вот демонстрация JavaScript ScriptEngine в виде апплета.

Читатель может заметить, что ScriptEngine — это интерфейс, предлагающий ответ «реализовать свой собственный скриптовый движок на основе требуемых правил». Является ли хорошей идеей создание другого языка сценариев, остается читателю в качестве упражнения.

person Andrew Thompson    schedule 19.08.2012