You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中如何在Printer类统一记录实现Employee接口对象的打印历史

解决方案

要在Printer类里统一管理所有员工的打印历史,最直接的方案是用**Map<Employee, List>**来存储——键是Employee实例,值是该员工打印过的文档列表。这样完全不用修改任何Employee实现类,把打印历史的管理逻辑都收拢在Printer中。

完整代码实现

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 19:10:23