我有一个关于银行账户单笔交易限额的快速问题。我有不同类型的银行账户,每个账户都有一定的单笔交易限额。但是,这些帐户类型中的某些没有交易限制。我可以想出一个非常简单的解决方案,它只使用一个常量来表示(参见下面的示例)。
private static final double NO_TRANSACTION_LIMIT = -1;
public enum BankAccountType {
GIRO_MINOR(0, 20, "Minor Account"),
GIRO_STUDENT(0, 200, "Student Account"),
GIRO_NORMAL(-2000, 4000, "Normal Account"),
SAVING(0, NO_TRANSACTION_LIMIT, "Saving Account");
// ...
private double transactionLimit;
// ...
public boolean hasTransactionLimit() {
return transactionLimit == NO_TRANSACTION_LIMIT;
}
}
经过一番思考,我认为一定有更好的解决方案来解决这个问题。因为如果由于某种原因在事务限制之前未检查 hasTransactionLimit()
方法,则可能会导致不需要的行为。
所以我的问题是:实现这样的行为的好策略是什么?不知怎的,我想到了空对象模式,但我很不确定。
最佳答案
我将使用方法 isTransactionAllowed(int amount)
创建一个接口(interface) BankAccount
,而不是使用返回交易限制的枚举。
因为您想要对枚举执行的操作是执行特定于类型的代码。这就是枚举被命名为 ...Type
的原因。在像 java 这样的面向对象语言中,您应该使用多态性来做到这一点。
例如
public interface BankAccount {
public boolean isTransactionAllowed(int amount);
}
具体的银行账户可以回答这个问题。静态或基于其实际状态。例如。 10 天内允许的交易限额为 200 笔,或者该银行账户允许的交易限额为 200 笔,而所有其他此类帐户仅允许 100 笔。
例如静态:
public class MinorBankAccount implements BankAccount {
private static final int MINOR_ACCOUNT_TRANSACTION_LIMIT = 20;
public boolean isTransactionAllowed(int amount) {
return amount <= MINOR_ACCOUNT_TRANSACTION_LIMIT;
}
}
你所做的通常是贫血设计的暗示。更多详情请查看我的博客 Enums as type discriminator anti-pattern
关于Java:银行账户交易限制 -> 如何表示某些账户没有限制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47922670/