为了账号安全,请及时绑定邮箱和手机立即绑定

如何将可变对象编排为跨对象不可变

如何将可变对象编排为跨对象不可变

一只萌萌小番薯 2021-12-10 14:47:22
我有一个像这样的java类class Runner {  public Object run(Map<String, Object> input);  public String name();}public class Test {  public static void main(String args[]) {      Map<String, Object> map = Maps.newHashMap();    List<Runner> runners;    forEach(Runner runner: runners) {      Object obj = runner.run(map);      map.put(runner.name(), obj);    }  }}在上面的代码中,我调用了 Runner 类的 run 方法并将它产生的输出添加到 Map<> 对象。对跑步者对象列表重复此操作。如何使 map 对象作为输入传递给 run 方法不可变?我想从地图创建一个不可变的地图并将其作为输入参数传递。但我担心我可能创建的不可变映射的数量取决于执行的运行器对象的数量,这可能会导致 OOM 错误。是否有任何可用的模式或解决方案来解决它?任何建议将不胜感激。
查看完整描述

2 回答

?
慕后森

TA贡献1802条经验 获得超5个赞

您可以通过可修改的 Map 支持不可修改的 Map。


它们具有相同的底层数据,但在不可修改的包装器中限制了对 setter API 的访问。


1即使您正在读取不可修改的地图,也会在更新可修改的地图时打印以下代码片段。您可能会注意到,它不会创建地图数据的两个副本,它们只是共享相同的值。


Map<String, String> modifiableMap = new HashMap<>();

Map<String, String> unmodifiableMap = Collections.unmodifiableMap(modifiableMap);

modifiableMap.put("a", "1");

System.out.println(unmodifiableMap.get("a"));

但是,尝试unmodifiableMap.put("a", "1")将导致UnsupportedOperationException预期的结果。


对于您的代码,您可以尝试这样的操作:


public static void main(String args[]) {

    Map<String, Object> modifiableMap = Maps.newHashMap();

    Map<String, Object> unmodifiableMap = Collections.unmodifiableMap(modifiableMap);

    List<Runner> runners;

    forEach(Runner runner: runners) {

        Object obj = runner.run(unmodifiableMap);

        modifiableMap.put(runner.name(), obj);

    }

}


查看完整回答
反对 回复 2021-12-10
?
Qyouu

TA贡献1786条经验 获得超11个赞

如果您只是通过run方法中的键获取地图值,那么您可以Map使用Function接口包装:


class Runner {

  public Object run(Function<String, Object> getter) {}

  public String name() {}

}


public static void main(String args[]) {  

  Map<String, Object> map = new HashMap<>();

  List<Runner> runners;

  for(Runner runner: runners) {

    Object obj = runner.run(map::get);

    map.put(runner.name(), obj);

  }

}


查看完整回答
反对 回复 2021-12-10
  • 2 回答
  • 0 关注
  • 179 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号