Класс, расширенный до BigDecimal, возвращает объект из типа суперкласса - PullRequest
0 голосов
/ 01 октября 2018

Я хочу сделать некоторые расчеты с деньгами.Чтобы предотвратить ошибки округления, я решил использовать BigDecimal вместо double или float.Теперь я думаю, что это не очень хорошая идея, потому что это чрезвычайно усложняет вычисления.

Я создал класс с именем Euro, который расширяется от BigDecimal, чтобы переопределить методы toString и equals.

Теперь, если я хочу добавить число к объекту Euro, я бы сделал это следующим образом:

Euro sum = (new Euro(10)).add(new Euro(15));

Проблема здесь в том, что add (...) возвращает объект из класса BigDecimal, который я не могуприведение к евро, поэтому я добавил это к классу евро:

public Euro add(Euro euro){
    return new Euro(euro.add((BigDecimal) this).floatValue());
}

Что я могу сделать сейчас, вместо того, чтобы переписывать все методы из BigDecimal в евро?Я думаю, лучшее решение - это использовать целое число для центов вместо BigDecimal, потому что тогда я могу написать

int sumCents = 1000 + 1500;

вместо долгосрочного значения выше.

1 Ответ

0 голосов
/ 01 октября 2018

В этом случае было бы лучше отдать предпочтение композиции, а не наследованию.Когда вы создаете подклассы BigDecimal для получения Euro, вы говорите, что Euro - это a BigDecimal.Точнее было бы сказать, что сумма Money имеет a BigDecimal (или вообще сумму).У него также есть символ, здесь евро.

Вы также можете использовать другую реализацию, например, количество центов, как вы уже думали, для хранения суммы в виде целого числа.Это подсказка, что наследование от BigDecimal не правильно.Кроме того, нет смысла вызывать pow на Euro, хотя это имеет смысл на BigDecimal.A Euro не является BigDecimal.

Кроме того, вызов floatValue (или doubleValue) только для преобразования в Euro лишил бы смысла использование BigDecimal в первую очередь- чтобы избежать ошибок округления с плавающей точкой при представлении суммы денег.

Когда вы используете композицию, вы можете выставлять только те методы, которые вам нужны, например, add и subtract, без переопределения методов.и создание новых объектов подкласса во время каждой математической операции.Математические операции выполняются над переменной экземпляра, а не над классом в целом, как деталь реализации.

...