Есть ли лучшая структура для этого оператора if? - PullRequest
0 голосов
/ 08 апреля 2019

Я пытаюсь создать здесь оператор if else, и меня немного запутывают значения return и результат boolean, которые мы получаем из условия.

Возможно лив этом случае есть два оператора return true или он выйдет после первого блока?

Есть ли лучший способ написать это?(возможно, используя switch?)

Этот код работает с выводом средств с текущего счета.Я хочу, чтобы он соответствовал следующим правилам:

  • Вернуть false, если сумма для снятия равна == или <0. </li>
  • Вернуть true, если сумма для снятия> 0.
  • Проверьте и верните true, если сумма будет снята> остаток.(но только один раз, поскольку я хочу разрешить снятие средств со счета только один раз.)
public boolean withdraw(double amount) {

//amount = amount of money asked to be withdrawn

    if (amount > balance) {
        setBalance(balance - amount - overdraftFee);
        return true;
    } else if (amount == 0) {
        System.out.println("Withdrawal amount cannot be $0.00!");
        return false;
    } else if (amount < 0) {
        System.out.println("Withdrawal amount cannot be a negative amount!");
        return false;
    } else {
        setBalance(balance - amount);
        return true;
    }
}

Ответы [ 3 ]

3 голосов
/ 08 апреля 2019

Метод остановит первый раз, когда он достигнет 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>
2 голосов
/ 08 апреля 2019

может быть несколько способов написать его более кратко, но я бы сделал это так:

public boolean withdraw(double amount) {
    if (amount <= 0.0) {
        System.out.println("Withdrawal amount should be positive!");
        return false;
    }

    double fee = (amount > balance) ? overdraftFee : 0.0;
    setBalance(balance - amount - fee);
    return true;
}
0 голосов
/ 08 апреля 2019

Вы можете использовать Switch Case

switch (amount) {
  case (0):
   //your code here
   break;
  case (0>):
   //your code here
   break;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...