
在开发涉及资金流转或任何需要跟踪事件的应用程序时,一个常见的需求是记录“历史”或“日志”。例如,在银行转账场景中,不仅要完成资金的扣除和增加,还需要记录谁在何时向谁转账了多少金额。原始的moneytransfer方法虽然可以执行一次转账操作并显示即时结果,但它并没有机制来保存这些交易的详细信息,一旦方法执行完毕,相关数据便会丢失。这是因为方法内部的局部变量生命周期仅限于该方法执行期间。要实现交易历史记录的保存,我们需要将数据存储在方法作用域之外,以便在应用程序的整个生命周期中访问和管理。
Java中的java.util.List接口及其实现类(如ArrayList)是存储动态数量对象的理想选择。它提供了一种有序的、可重复的元素集合,非常适合作为交易历史记录的容器。然而,仅仅存储字符串或整数是不够的,为了清晰地表示一笔交易的所有相关信息(如转账方、接收方、金额、时间),我们需要定义一个自定义的数据结构,即一个Java类来封装这些属性。
首先,创建一个TransactionRecord类来封装一笔交易的所有必要信息。这通常包括转账人、接收人、转账金额以及交易发生的时间戳。
import java.time.LocalDateTime; // 导入用于获取当前时间的类
/**
* 封装一笔交易的详细信息。
*/
public class TransactionRecord {
private String sender;
private String recipient;
private int amount;
private LocalDateTime timestamp;
public TransactionRecord(String sender, String recipient, int amount) {
this.sender = sender;
this.recipient = recipient;
this.amount = amount;
this.timestamp = LocalDateTime.now(); // 记录交易发生时的当前时间
}
// Getter 方法,用于外部访问交易记录的属性
public String getSender() {
return sender;
}
public String getRecipient() {
return recipient;
}
public int getAmount() {
return amount;
}
public LocalDateTime getTimestamp() {
return timestamp;
}
@Override
public String toString() {
return String.format("时间: %s, 转账人: %s, 接收人: %s, 金额: %d",
timestamp.format(java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")),
sender, recipient, amount);
}
}在主应用程序类中,声明一个静态的List<TransactionRecord>来存储所有交易历史。在每次成功转账后,创建一个TransactionRecord对象并将其添加到这个列表中。
假设我们有一个BankApp类来管理转账逻辑和历史记录。
立即学习“Java免费学习笔记(深入)”;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class BankApp {
private static int balance = 1000; // 示例账户余额
private static Scanner scanner = new Scanner(System.in);
// 声明一个List来存储交易历史记录
private static List<TransactionRecord> transactionHistory = new ArrayList<>();
public static String moneyTransfer(String currentUser) { // 假设currentUser是当前登录的用户
System.out.println("请输入您要转账的账户名:");
String recipientName = scanner.nextLine(); // 接收方账户名
System.out.println("请输入要转账的金额给用户 " + recipientName + ":");
int transferAmount = 0;
try {
transferAmount = scanner.nextInt();
} catch (java.util.InputMismatchException e) {
System.out.println("输入金额无效,请输入一个整数。");
scanner.nextLine(); // 消耗掉错误的输入
return "转账失败:金额输入错误。";
} finally {
scanner.nextLine(); // 消耗掉nextInt()留下的换行符,避免影响后续nextLine()
}
if (transferAmount <= 0) {
System.out.println("转账金额必须大于零。");
return "转账失败:金额无效。";
}
if (balance < transferAmount) {
System.out.println("余额不足,无法完成转账。当前余额:" + balance);
return "转账失败:余额不足。";
}
// 执行转账操作
balance -= transferAmount;
System.out.println("您成功转账 " + transferAmount + " 给用户: " + recipientName);
System.out.println("当前余额: " + balance);
// 创建并保存交易记录
TransactionRecord record = new TransactionRecord(currentUser, recipientName, transferAmount);
transactionHistory.add(record); // 将交易记录添加到历史列表中
return "转账成功!";
}
/**
* 显示所有交易历史记录。
*/
public static void displayTransactionHistory() {
if (transactionHistory.isEmpty()) {
System.out.println("目前没有交易历史记录。");
return;
}
System.out.println("\n--- 交易历史记录 ---");
for (TransactionRecord record : transactionHistory) {
System.out.println(record.toString());
}
System.out.println("--------------------");
}
public static void main(String[] args) {
String currentUser = "用户A"; // 示例当前用户
// 模拟几次转账操作
System.out.println("欢迎来到银行应用!当前余额: " + balance);
// 第一次转账
System.out.println(moneyTransfer(currentUser));
// 第二次转账
System.out.println(moneyTransfer(currentUser));
// 显示历史记录
displayTransactionHistory();
// 尝试一次失败的转账
System.out.println(moneyTransfer(currentUser));
// 再次显示历史记录,确认失败的转账不会被记录
displayTransactionHistory();
scanner.close();
}
}在上述代码中,我们做了以下改进:
通过本教程,我们学习了如何使用java.util.List集合结合自定义对象(TransactionRecord)在Java应用程序中实现交易历史记录的内存存储。这种方法简单有效,适用于学习和小型应用场景。然而,为了构建生产级别的应用程序,理解并掌握数据持久化(文件I/O或数据库)和并发控制等高级概念是必不可少的。随着您在Java学习旅程中的不断深入,这些更复杂的技术将逐步解锁,帮助您构建更加健壮和功能完善的应用程序。
以上就是Java应用程序中实现交易历史记录的存储与管理的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号