gpt4 book ai didi

java - 如何将可变对象编排为跨对象的不可变对象(immutable对象)

转载 作者:行者123 更新时间:2023-11-30 02:00:30 27 4
gpt4 key购买 nike

我有一个像这样的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 错误。是否有任何可用的模式或解决方案可以解决这个问题?如有任何建议,我们将不胜感激。

最佳答案

您可以用可修改的 map 来支持不可修改的 map 。

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

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

Map<String, String> modifiableMap = new HashMap<>();
Map<String, String> unmodifiableMap = Collections.unmodifiableMap(modifiableMap);
modifiableMap.put("a", "1");
System.out.println(unmodifiableMap.get("a"));

但是,尝试 unmodifyingMap.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);
}
}

关于java - 如何将可变对象编排为跨对象的不可变对象(immutable对象),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53016262/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com