如何从HashMap的Account对象中访问修改accOpBalance及存储交易记录
解决方案与代码示例
1. 先规范Account类的设计
要安全修改余额并记录交易,首先得把账户核心数据封装好,避免外部直接操作字段。下面是优化后的Account类:
import java.util.LinkedList; import java.util.List; public class Account { // 私有字段,禁止外部直接修改 private double accOpBalance; // 用LinkedList存交易记录,方便快速添加最新记录、删除最旧记录 private List<String> recentTransactions; // 固定最多保存6条交易 private static final int MAX_TRANSACTIONS = 6; // 构造方法初始化余额和交易记录集合 public Account(double initialBalance) { this.accOpBalance = initialBalance; this.recentTransactions = new LinkedList<>(); } // 获取当前余额的方法 public double getAccOpBalance() { return accOpBalance; } // 存款操作:校验金额有效性,修改余额并记录交易 public void deposit(double amount) { if (amount > 0) { accOpBalance += amount; addTransaction("存款 +" + amount + ",当前余额:" + accOpBalance); } } // 取款操作:校验金额和余额,修改余额并记录交易 public void withdraw(double amount) { if (amount > 0 && amount <= accOpBalance) { accOpBalance -= amount; addTransaction("取款 -" + amount + ",当前余额:" + accOpBalance); } else { addTransaction("取款失败:金额无效或余额不足,尝试金额:" + amount); } } // 统一处理交易记录:最新记录放最前面,超过6条就删掉最旧的 private void addTransaction(String transaction) { recentTransactions.add(0, transaction); if (recentTransactions.size() > MAX_TRANSACTIONS) { recentTransactions.remove(MAX_TRANSACTIONS); } } // 获取交易记录的副本,避免外部直接修改内部集合 public List<String> getRecentTransactions() { return List.copyOf(recentTransactions); } }
2. HashMap中账户的操作
HashMap里存的是Account对象的引用,所以取出对象后直接调用方法修改,不需要重新put回Map。下面是使用示例:
import java.util.HashMap; import java.util.Map; public class AccountManager { public static void main(String[] args) { // 初始化存储账户的HashMap,键用账号,值用Account对象 Map<String, Account> accountMap = new HashMap<>(); // 添加一个初始余额1000的账户 accountMap.put("ACC1001", new Account(1000.0)); // 取出账户并执行交易 Account account = accountMap.get("ACC1001"); if (account != null) { account.deposit(500.0); account.withdraw(200.0); account.deposit(300.0); account.withdraw(150.0); account.deposit(400.0); account.withdraw(250.0); account.deposit(100.0); // 第7笔交易,会自动删除最旧的那一条 } // 查看账户状态 Account targetAccount = accountMap.get("ACC1001"); if (targetAccount != null) { System.out.println("当前余额:" + targetAccount.getAccOpBalance()); System.out.println("最近6条交易记录:"); for (String trans : targetAccount.getRecentTransactions()) { System.out.println("- " + trans); } } } }
3. 给新手的代码反馈
- 别直接暴露类字段:如果把
accOpBalance设为public,外部可能直接把余额改成负数或者不合理的值,用私有字段+方法的封装方式,能在方法里做校验,保证数据合法。 - 选对集合类型:用LinkedList存交易记录,头部添加和尾部删除的效率比ArrayList高,适合这种需要频繁更新顺序的场景。
- 判空很重要:从HashMap取账户时一定要检查是否为null,不然容易触发
NullPointerException。 - 交易记录可扩展:如果以后需要更详细的交易信息(比如交易时间、交易类型编码),可以把
String换成一个专门的Transaction类,包含时间、金额、类型等字段,扩展性更强。 - 避免直接修改内部集合:返回交易记录时用
List.copyOf()返回不可修改的副本,防止外部代码不小心篡改账户的交易记录。
内容的提问来源于stack exchange,提问作者Callium1456
相关产品推荐
相关产品推荐

