Task类存入List后打印显示异常,如何实现正常展示与持久化?
问题描述
我想开发一个任务管理器作为练手项目,但遇到了问题。我定义了如下Task类:
public Task(int id, String title, String description, LocalDate dueDate, boolean status) { this.id = id; this.title = title; this.description = description; this.dueDate = dueDate; this.status = false; }
希望将Task实例添加到List中并保存到文本文件。但将Task加入List后打印时,输出的是类似Task@1ddc4ec2的内容,无法看到任务的详细信息。我不确定是否可以这样将类存入List,也不知道该如何解决,希望得到建议。
我创建任务的代码如下:
tm.addTask(new Task(1, "First Try", "My first try to add a task", LocalDate.now(), false)); tm.addTask(new Task(2, "Second add", "The second task I'm adding.", LocalDate.now(), false));
打印代码为:
System.out.println("All tasks in the list: " + tm.tasks);
我有一个独立的TaskManager类(实例为tm),其中包含名为tasks的列表。我期望看到每个任务的所有详细信息,但得到的输出却是All tasks in the list: [Task@9807454, Task@1ddc4ec2]。
解决方案
首先明确:完全可以把自定义类的实例存入List,你遇到的问题只是Java默认的对象打印逻辑导致的。
1. 重写Task类的toString()方法
Java中打印对象时,默认调用Object类的toString()方法,输出格式为类名@哈希码。要显示任务的详细信息,必须在Task类中重写这个方法,返回包含任务属性的可读字符串。
示例代码:
import java.time.LocalDate; public class Task { private int id; private String title; private String description; private LocalDate dueDate; private boolean status; public Task(int id, String title, String description, LocalDate dueDate, boolean status) { this.id = id; this.title = title; this.description = description; this.dueDate = dueDate; this.status = false; } // 重写toString(),自定义输出格式 @Override public String toString() { return "Task{" + "id=" + id + ", title='" + title + '\'' + ", description='" + description + '\'' + ", dueDate=" + dueDate + ", status=" + (status ? "已完成" : "未完成") + '}'; } // 为后续保存文件添加getter方法,方便读取属性 public int getId() { return id; } public String getTitle() { return title; } public String getDescription() { return description; } public LocalDate getDueDate() { return dueDate; } public boolean isStatus() { return status; } }
重写后,直接打印tm.tasks就会输出每个任务的详细属性。
2. 关于将Task保存到文本文件的建议
如果要把列表中的Task实例保存到文本文件,有两种实用方式:
- 方式一:基于字符串写入:遍历
List,将每个Task的属性用分隔符(比如|)拼接成字符串,每行写入一个任务。读取时按分隔符拆分字符串,重新构建Task实例。这种方式的文件是可读文本,便于调试。 - 方式二:对象序列化:让
Task类实现Serializable接口,使用ObjectOutputStream将整个List写入文件,读取时用ObjectInputStream恢复。这种方式适合复杂对象,但文件是二进制格式,无法直接查看。
示例代码(方式一,写入文本文件):
import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; import java.util.List; public class TaskManager { private List<Task> tasks; // 省略addTask等已有方法 public void saveTasksToFile(String filePath) throws IOException { try (BufferedWriter writer = new BufferedWriter(new FileWriter(filePath))) { for (Task task : tasks) { String line = task.getId() + "|" + task.getTitle() + "|" + task.getDescription() + "|" + task.getDueDate() + "|" + task.isStatus(); writer.write(line); writer.newLine(); } } } }
内容的提问来源于stack exchange,提问作者Valle
相关产品推荐
相关产品推荐

