Java:银行账户交易限额 - >如何表示某些账户没有限制?

问题描述 投票:0回答:1

我有一个关于代表银行账户的单一交易限额的快速问题。我有不同类型的银行账户,每个账户都有一定的交易限额。但是,其中一些帐户类型没有交易限制。我可以想出一个非常简单的解决方案,它只使用一个常量来表示(参见下面的例子)。

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模式,但我很不确定。

java design-patterns
1个回答
2
投票

我将使用方法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

© www.soinside.com 2019 - 2024. All rights reserved.