gpt4 book ai didi

java - 在 Java 中最好没有工厂的情况下克隆通用对象的有效方法

转载 作者:行者123 更新时间:2023-11-29 03:44:46 25 4
gpt4 key购买 nike

我发现自己必须导出对底层 Java collections 映射中键的引用。我不想提供对实际关键对象的引用,而是提供它们的副本以确保没有人摆弄这些值并弄乱 map 。所以我需要创建一个任意泛型类型的副本。

我已经编写了一个实用程序类,它通过内存序列化来完成此操作,但后来注意到 Collections.nCopies 也为我提供了一些东西的副本。

因此,为了让您了解我在做什么,例如,我需要在给定其他键值的情况下访问下一个(更高/更低)键值。

public class MapWrapper<T, K extends Comparable<K>>
implements OtherThing<T, K>
{
public K next (K current) {
return ... cloned next highest key as per NavigableMap.higherKey()
}
}

所以问题是复制对象是否更好

T copy = Collections.nCopies(1,item).get(0)

或者序列化对象然后反序列化

final ByteArrayOutputStream outputBuffer = new ByteArrayOutputStream();
final ObjectOutputStream outputStream = new ObjectOutputStream(outputBuffer);
outputStream.writeObject(item);
outputStream.close();

final ByteArrayInputStream inputBuffer = new ByteArrayInputStream(buffer);
final ObjectInputStream inputStream = new ObjectInputStream(inputBuffer);T copy = null;
T item = null;
try {
copy = (T)inputStream.readObject();
} catch (ClassNotFoundException e) {
Logger.getLogger(SerialisationService.class.getName()).log(Level.WARNING, null, e);
}

inputStream.close();
inputBuffer.close();
outputBuffer.close();

复制 Long 的快速测试表明 Collections.nCopies 更快(0 毫秒/8 毫秒)。不过,我在这么晚的时候还没有想到这种方法有什么需要注意的地方吗?或者你能想到一种更好的方法来获取 key 的副本吗?

最佳答案

有一个显着的区别 - Collections.nCopies 不复制对象!它只返回一个包含 n 条目的 List,所有这些都是提供的对象(check the source!)。对该列表中的任何内容所做的任何更改都将反射(reflect)在原始对象中。所以这段代码:

Point original = new Point(0, 0);
Point supposedCopy = Collections.nCopies(1, original).get(0);
supposedCopy.x = 13;
System.out.println("x = " + original.x);

将打印 13,而不是 0。糟糕。

序列化往返不是一个坏主意。另一种方法是使用 Cloneable ,不幸的是有点坏了。 Cloneable 没有声明 clone(),但它是 declared as protected in Object ,所以你必须通过反射来调用它。

就个人而言,如果可能的话,我更愿意在您的情况下使用不可变对象(immutable对象)。

关于java - 在 Java 中最好没有工厂的情况下克隆通用对象的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11509693/

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