繁体   English   中英

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

[英]How to orchestrate mutable object as immutable across objects

我有一个像这样的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 <>对象。 对运行器对象列表重复此操作。 如何使映射对象作为输入传递给run方法不可变? 我考虑过从地图创建不可变地图,并将其作为输入参数传递。 但是我担心我可能会创建的不可变映射的数量取决于执行的运行程序对象的数量,这可能导致OOM错误。 是否有任何可用的模式或解决方案? 任何建议,将不胜感激。

如果您只是通过run方法中的键获取地图值,则可以将MapFunction接口包装在一起:

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);
  }
}

您可以通过可修改的地图来支持不可修改的地图。

它们具有相同的基础数据,但是在不可修改的包装器中限制了对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);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM