我有一个关于代表银行账户的单一交易限额的快速问题。我有不同类型的银行账户,每个账户都有一定的交易限额。但是,其中一些帐户类型没有交易限制。我可以想出一个非常简单的解决方案,它只使用一个常量来表示(参见下面的例子)。
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()
,这可能会导致不必要的行为。
所以我的问题是:实施这样的行为的好策略是什么?不知怎的,我想到了Null-Object模式,但我很不确定。
我将使用方法BankAccount
创建一个接口isTransactionAllowed(int amount)
,而不是使用返回转换限制的枚举。
因为您想要对枚举执行的操作是执行特定于类型的代码。这就是枚举被命名为...Type
的原因。在像java这样的面向对象语言中,你应该使用多态。
EG
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