if语句是否有更好的结构?

时间:2019-04-08 03:12:41

标签: java if-statement

我试图在此处构造一个if else语句,并将其与从条件中获得的return值和boolean的结果混淆了。

在这种情况下,是否可能有两个语句return true还是在第一个程序段之后退出?

有没有更好的方法来写这个? (也许使用switch?)

此代码可用于支票账户提款。我希望它符合以下规则:

  • 如果要提取的金额为==或<0,则返回false。
  • 如果要提取的金额> 0,则返回true。
  • 如果要提取的金额>余额,请检查并返回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 个答案:

答案 0 :(得分:3)

该方法将在第一次到达return时停止。这样做的副作用是,如果else块将在if块中返回,则无需使用false块(因为只有在条件{{1 }}。

更重要的是,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>

答案 1 :(得分:2)

可能有多种方法可以更简洁地编写它,但我会这样做:

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;
}

答案 2 :(得分:-5)

您可以使用Switch Case

switch (amount) {
  case (0):
   //your code here
   break;
  case (0>):
   //your code here
   break;
}