gpt4 book ai didi

Java:我应该每次构造轻量级对象还是缓存实例?

转载 作者:太空宇宙 更新时间:2023-11-04 06:48:27 24 4
gpt4 key购买 nike

在代码审查期间,我的一位同事查看了这段代码:

public List<Item> extractItems(List<Object[]> results) { 
return Lists.transform(results, new Function<Object[], Item>() {
@Override
public Item apply(Object[] values) {
...
}
});
}

他建议将其更改为:

public List<Item> extractItems(List<Object[]> results) { 
return Lists.transform(results, getTransformer());
}

private Function<Object[], Item> transformer;

private Function<Object[], Item> getTransformer() {
if(transformer == null) {
transformer = new Function<Object[], Item>() {
@Override
public Item apply(Object[] values) {
...
}
};
}
return transformer;
}

因此,我们正在考虑采用 new Function() 构造,并将其移至成员变量并在下次重新使用。

虽然我理解他的逻辑和推理,但我想我并不认为我应该对我创建的遵循此模式的每个可能的对象执行此操作。似乎有一些充分的理由不这样做,但我不确定。

你有什么想法?我们是否应该始终像这样缓存重复创建的对象?

更新

Function 是 google guava 的东西,并且不保存任何状态。有几个人指出了此更改的非线程安全方面,这是完全有效的,但实际上并不是这里所关心的问题。我更多的是关于构造小对象和缓存小对象的做法,哪个更好?

最佳答案

您同事的提案不是线程安全的。它还带有过早优化的味道。 Function 对象的构造是否是已知的(经过测试的)CPU 瓶颈?如果不是,就没有理由这样做。这不是内存问题 - 您没有保留引用,因此 GC 会将其清除,可能是从 Eden 清除。

关于Java:我应该每次构造轻量级对象还是缓存实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23659502/

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