如何在Employee类中获取Stock类的HashMap值?
解决Employee类访问Stock类HashMap键值对的问题
现有代码的冗余问题
你当前的Employee构造函数存在不必要的HashMap复制操作:
this.pro = stock.products; for(String k : stock.getProducts().keySet()){ pro.put(k, stock.getProducts().get(k)); }
pro = stock.products已经让pro直接引用了Stock的products HashMap,后续的循环复制完全多余,属于重复操作。
几种可行的实现方式
方式1:直接调用Stock类已有的listProducts方法(最简洁)
Stock类已经实现了listProducts()方法用于遍历输出所有键值对,Employee的viewSupplies可以直接委托给这个方法:
public void viewSupplies(){ stock.listProducts(); }
方式2:通过Stock的getProducts方法获取HashMap后遍历
利用Stock提供的getProducts()方法获取HashMap,再遍历输出,这种方式更符合封装原则(不直接访问public成员):
public void viewSupplies(){ HashMap<String, Integer> products = stock.getProducts(); for (Map.Entry<String, Integer> entry : products.entrySet()){ System.out.println(entry.getKey() + ": " + entry.getValue()); } }
这种方式比遍历keySet()再调用getValue()更高效,因为entrySet()可以直接拿到完整的键值对,减少一次哈希查找。
方式3:直接访问Stock的public products成员(不推荐)
虽然Stock的products是public的,可以直接访问,但这种做法破坏了封装性,后续如果Stock的内部实现修改(比如换成其他集合类型),Employee的代码也需要跟着调整:
public void viewSupplies(){ for (Map.Entry<String, Integer> entry : stock.products.entrySet()){ System.out.println(entry.getKey() + ": " + entry.getValue()); } }
方式4:优化你原本的代码(去掉冗余)
如果坚持要在Employee里维护一个pro引用,只需去掉构造函数里的循环复制,同时改用getProducts()获取集合(更规范):
// 构造函数修改 public Employee(int id, String n, String pho, String u, String pa, int sId){ this.ID=id; this.name = n; this.phoneNumber=pho; this.username=u; this.password=pa; this.stock = new Stock(sId); this.pro = stock.getProducts(); } // viewSupplies修改 public void viewSupplies(){ for (Map.Entry<String, Integer> entry : pro.entrySet()){ System.out.println(entry.getKey() + ": " + entry.getValue()); } }
额外建议
- 尽量避免把集合成员设为public,依赖getter方法更符合面向对象的封装原则,能降低类之间的耦合度。
- 遍历HashMap时优先使用
entrySet(),性能优于keySet()搭配getValue()的组合。
内容的提问来源于stack exchange,提问作者emcosokic
相关产品推荐
相关产品推荐

