Java如何将Account嵌套的信用卡借记卡类拆分为独立关联类
实现思路
- 首先修正原代码的核心问题:原Account类的
balance、accountNumber用了static修饰,会导致所有账户共享同一个余额和账号,完全不符合业务逻辑,先把static修饰符去掉,改成每个Account实例独有属性 - 拆分后的DebitCard、CreditCard类内部持有关联Account的引用,这样消费/还款时可以直接操作对应绑定账户的余额
- Account类新增借记卡、信用卡成员变量,提供绑定卡片的方法,支持创建账户时直接绑定对应卡片,也支持后续绑定
- 修复原有CreditCard类
creditCardPurchase方法重复累加债务、重复扣减额度的bug
1. 独立Account类代码
package accounts; public class Account { // 去掉static修饰,每个账户独有余额和账号 protected double balance; protected String accountNumber; // 关联的借记卡、信用卡 private DebitCard debitCard; private CreditCard creditCard; public Account() { } public Account(String accountNumber, double balance) { this.accountNumber = accountNumber; this.balance = balance; } // 绑定借记卡方法 public void bindDebitCard(String userName, int cardNumber) { this.debitCard = new DebitCard(userName, cardNumber, this); } // 绑定信用卡方法 public void bindCreditCard(String userName, int cardNumber, double limit) { this.creditCard = new CreditCard(userName, cardNumber, limit, this); } // 获取绑定的借记卡 public DebitCard getDebitCard() { return debitCard; } // 获取绑定的信用卡 public CreditCard getCreditCard() { return creditCard; } public double getBalance() { return balance; } public String getAccountNumber() { return accountNumber; } public void deposit(double depositAmount) { this.balance += depositAmount; } public void extraction(double extractionAmount) { this.balance -= extractionAmount; } public void showBalance() { System.out.println("Your current balance is: " + getBalance()); } }
2. 独立DebitCard类代码
package accounts; public class DebitCard { private String userName; private int cardNumber; // 持有绑定的账户引用 private Account bindAccount; public DebitCard() { } // 构造方法传入绑定的账户 public DebitCard(String userName, int cardNumber, Account bindAccount) { this.userName = userName; this.cardNumber = cardNumber; this.bindAccount = bindAccount; } public String getUserName() { return userName; } public int getCardNumber() { return cardNumber; } public void debitPurchase(double purchaseAmount) { // 操作绑定账户的余额 bindAccount.extraction(purchaseAmount); } }
3. 独立CreditCard类代码
package accounts; public class CreditCard { private String userName; private int cardNumber; private double creditCardDebt; private double limit; // 持有绑定的账户引用 private Account bindAccount; public CreditCard() { } public CreditCard(String userName, int cardNumber, double limit, Account bindAccount) { this.userName = userName; this.cardNumber = cardNumber; this.limit = limit; this.bindAccount = bindAccount; } public String getUserName() { return userName; } public int getCardNumber() { return cardNumber; } public double getLimit() { return limit; } public double getCreditCardDebt() { return creditCardDebt; } public void creditCardPurchase(double purchaseAmount) { if (this.creditCardDebt + purchaseAmount > this.limit) { throw new Error("There's not enough limit to make this purchase"); } // 修复原代码重复计算的bug this.creditCardDebt += purchaseAmount + (purchaseAmount * 0.03); this.limit -= purchaseAmount; } public void payCard(double payAmount) { // 从绑定账户扣减还款金额 bindAccount.extraction(payAmount); this.creditCardDebt -= payAmount; } }
使用示例
public class Test { public static void main(String[] args) { // 1. 创建账户,初始余额10000元 Account myAccount = new Account("622202xxxx", 10000); // 2. 绑定借记卡 myAccount.bindDebitCard("张三", 12345678); // 3. 绑定信用卡,额度5000元 myAccount.bindCreditCard("张三", 87654321, 5000); // 借记卡消费1000元 myAccount.getDebitCard().debitPurchase(1000); myAccount.showBalance(); // 输出余额9000 // 信用卡消费1000元,债务+1030(含3%利息),额度剩4000 myAccount.getCreditCard().creditCardPurchase(1000); System.out.println("信用卡当前债务:" + myAccount.getCreditCard().getCreditCardDebt()); // 输出1030 System.out.println("信用卡剩余额度:" + myAccount.getCreditCard().getLimit()); // 输出4000 // 信用卡还款1030元 myAccount.getCreditCard().payCard(1030); myAccount.showBalance(); // 输出余额7970 System.out.println("信用卡当前债务:" + myAccount.getCreditCard().getCreditCardDebt()); // 输出0 } }
内容的提问来源于stack exchange,提问作者Wasivis
相关产品推荐
相关产品推荐

