Java中如何在Printer类统一记录实现Employee接口对象的打印历史
解决方案
要在Printer类里统一管理所有员工的打印历史,最直接的方案是用**Map<Employee, List
完整代码实现
import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Collections; public class Printer { // 用HashMap存储员工与对应打印历史;若需保留打印顺序,可替换为LinkedHashMap private final Map<Employee, List<String>> printHistoryMap = new HashMap<>(); public void printDocument(String document, Employee employee) { System.out.println(document); // 自动为新员工创建空列表,再添加当前打印文档 printHistoryMap.computeIfAbsent(employee, k -> new ArrayList<>()).add(document); } public List<String> getPrintHistory(Employee employee) { // 若员工无打印记录,返回空列表;返回不可修改的列表避免外部篡改内部数据 List<String> history = printHistoryMap.getOrDefault(employee, Collections.emptyList()); return Collections.unmodifiableList(history); } }
关键注意事项
- 必须重写Employee的equals和hashCode:HashMap依赖这两个方法判断Employee实例是否为同一对象。比如如果Employee有唯一标识ID,equals逻辑应基于ID比较,hashCode也需基于ID生成,否则会出现同一员工被重复存储的问题。
- 线程安全处理(按需):如果Printer会在多线程环境下使用,建议将HashMap替换为
ConcurrentHashMap,或者在操作printHistoryMap时添加同步锁,避免并发修改异常。 - 返回不可修改列表:用
Collections.unmodifiableList包装返回结果,防止外部代码直接修改Printer内部的打印历史,保证数据的一致性和安全性。
内容的提问来源于stack exchange,提问作者Jakob Huuse
相关产品推荐
相关产品推荐

