gpt4 book ai didi

java - BigDecimal 包装器 : to have a ZERO static field

转载 作者:行者123 更新时间:2023-12-02 09:31:24 25 4
gpt4 key购买 nike

我的自定义 Money 类是 BigDecimalorg.joda.money.Money 类的一种包装器。

BigDecimal 相同,我需要在我的应用程序周围使用 Money.ZERO (通常在 reduce() 操作中)。

我发现我的 Money.ZERO 在应用程序执行期间发生变化(即,其 amount 值可能为非零),导致无效结果。

下面是我的自定义 Money 类:

@Getter
@Embeddable
@NoArgsConstructor(access = AccessLevel.PRIVATE)
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public class Money implements Serializable {
private static final long serialVersionUID = -4274180309004444639L;

public static final Money ZERO = new Money(BigDecimal.ZERO, CurrencyUnit.EUR);

private BigDecimal amount;

@Convert(converter = CurrencyUnitToStringConverter.class)
private CurrencyUnit currency;

public static Money of(BigDecimal amount, CurrencyUnit currency) {
return new Money(amount, currency);
}

public Money add(Money addition) {
checkCurrency(addition);

amount = amount.add(addition.getAmount());
return new Money(amount, currency);
}

public Money substract(Money reduction) {
checkCurrency(reduction);

amount = amount.subtract(reduction.getAmount());
return new Money(amount, currency);
}

private void checkCurrency(Money other) {
if (!Objects.equal(getCurrency(), other.getCurrency())) {
throw new IllegalArgumentException("Currency does not match when adding amounts!");
}
}

所以我的目标是拥有一个 ZERO 字段,其数量永远保持为 BigDecimal.ZERO

最佳答案

您正在修改内部状态。

看看例如在您的 add 方法中:

public Money add(Money addition) {
checkCurrency(addition);

amount = amount.add(addition.getAmount());
return new Money(amount, currency);
}

在此方法中,您将重新分配 amount,从而更改当前 Money 实例的值。

这是一个简单的修复:

public Money add(Money addition) {
checkCurrency(addition);

BigDecimal newAmount = amount.add(addition.getAmount());
return new Money(newAmount, currency);
}

这同样适用于您的 substract 方法。

关于java - BigDecimal 包装器 : to have a ZERO static field,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57937524/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com