gpt4 book ai didi

java - 重构 if 语句,我必须初始化不同的对象

转载 作者:行者123 更新时间:2023-12-02 10:33:49 24 4
gpt4 key购买 nike

我正在寻找处理此方法的最明智的方法

public boolean addAccount(String cf, AccountType type) {
String iban = name + cf;
if (bankAccounts.containsKey(iban)) return false;
if (type.name().equals("CHECKINGACCOUNT")) {
CheckingAccount cc = new CheckingAccount(cf, iban, 0);
bankAccounts.put(iban, cc);
return true;
}
if (type.name().equals("DEPOSIT")) {
DepositAccount cd = new DepositAccount(cf, iban, 0);
bankAccounts.put(iban, cd);
return true;
}
if (type.name().equals("WEB")) {
WebAccount cw = new WebAccount(cf, iban, 0);
bankAccounts.put(iban, cw);
return true;
}
return false;
}

AccountType 是包含 (DEPOSIT,WEB,CHECKINGACCOUNT) 的枚举;bankAccounts 是一个包含 iban (键)和 CheckingAccounts OR DepositAccount OR WebAccount 的 HashMap;CheckingAccountsDepositAccountWebAccount 是 3 个类,它们继承了名为 Account 的抽象类。

我正在尝试用 HashMap 替换 if,该 HashMap 使用用户插入的字符串检查 key (帐户类型),并实例化与该 key 关联的三个类之一 HashMap 。问题是我无法创建字符串和帐户之间的对应关系,因为我需要实例化它(但我当时不知道 cf)

有人可以告诉我一些更好的方法来管理它吗?

最佳答案

为什么不使用工厂模式将要创建的帐户的逻辑放在枚举本身中?从 Java 8 开始,这种模式就非常灵活,因为您可以直接将构造函数作为工厂的实现传递:

public boolean addAccount(String cf, AccountType type) {
String iban = name + cf;
if (bankAccounts.containsKey(iban)) return false;
Account account = type.createAccount(cf, iban, 0);
bankAccounts.put(iban, account);
return true;
}

public enum AccountType {
CHECKING(CheckingAccount::new),
DEPOSIT(DepositAccount::new),
WEB(WebAccount::new);

private final AccountFactory factory;
AccountType(AccountFactory factory) {
this.factory = factory;
}

public Account createAccount(String cf, String iban, int x) {
return factory.create(cf, iban, x);
}
}

public interface AccountFactory {
Account create(String cf, String iban, int x);
}

与切换或映射方法相比,此解决方案具有巨大的优势:如果您添加新的子类和新的帐户类型,您就不可能忘记处理这种新类型。其他解决方案将在运行时(而不是编译时)失败或给出不正确的结果

关于java - 重构 if 语句,我必须初始化不同的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53451601/

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