Метод остановит первый раз, когда он достигнет return
. Побочным эффектом этого является то, что вам не нужно использовать блоки else
, если он будет возвращен в блоке if
(поскольку все, что после этого блока будет запущено, только если условие было false
).
Что еще более важно, double
не является хорошим выбором для использования для денежных сумм в Java, и приведет к ошибкам округления в вашем коде (я объясню больше после блока кода). Лучший вариант - BigDecimal
.
Другой способ написать это будет:
public boolean withdraw(BigDecimal amount) {
if (BigDecimal.ZERO.equals(amount)) {
System.out.println("Withdrawal amount cannot be $0.00!");
return false;
}
if (BigDecimal.ZERO.compareTo(amount) < 0) {
System.out.println("Withdrawal amount cannot be a negative amount!");
return false;
}
BigDecimal feeToCharge = (this.balance.compareTo(amount) < 0) ? this.overdraftFee : BigDecimal.ZERO;
setBalance(this.balance.minus(amount).minus(feeToCharge));
return true;
}
Причина использования BigDecimal
вместо double
для валюты заключается в том, что из-за способа представления двойного числа внутренне, не все десятичные числа могут быть точно сохранены. Это приводит к ошибкам округления, что важно для валюты. Например, следующий тест не пройден:
@Test
public void testDoubleSubtraction() {
assertThat(0.3D - 0.1D, is(0.2D));
}
с ошибкой
java.lang.AssertionError:
Expected: is <0.2>
but: was <0.19999999999999998>