如何在c#或Java中创建任意对象的副本

本文关键字:任意 创建 对象 副本 Java | 更新日期: 2023-09-27 18:08:26

假设我需要创建一个多集数据结构,其中包含两个集的相交和并等操作。使用c#或java。

在这两种情况下,我都需要创建两个集合的每个对象的副本,否则改变其中一个可能会破坏其他集合。

我看到一个解决方案:指定泛型类型,例如
class MultiSet<T, U> where T : struct, where U : ICloneable

或者java中类似的东西

有其他方法来解决这个问题吗?

如何在c#或Java中创建任意对象的副本

在这两种情况下,我都需要创建两个集合的每个对象的副本,否则改变其中一个会破坏其他集合

如果您想要两个对象集合的相交,您将需要引用结果"匹配"的对象,而不是它们的副本。后者没有意义。

要检查两个对象是否相同(在集合1和集合2中),只需以有意义的方式比较它们(即覆盖它们的哈希码和比较方法)。

结果集合的结构还取决于对象是否可以在它们的引用不相等的情况下彼此相等。在这种情况下,结果集合将需要保存两个引用(每个"匹配"两个),每个集合一个。

对于联合,只需创建一个集合,该集合包含对两个集合中所有对象的引用。

完整旁注

并和相交是数据操作,所以我假设你的集合将保存数据。在编程语言中做这样的操作并不是最好的主意。还有其他工具更适合这个任务,比如SQL。

除了推荐的iclonable ?(我说的是推荐的方法,但是克隆通常被认为是不好的)

我想如果对象是可序列化的,你可以作为一个新对象进行序列化和反序列化。

    var formatter = new BinaryFormatter();
    var stream = new MemoryStream();
    using (stream)
    {
        formatter.Serialize(stream, yourObject);
        stream.Seek(0, SeekOrigin.Begin);
        return (YourObjectType)formatter.Deserialize(stream);
    }

添加一个null检查,它将成为可序列化对象的一个很好的扩展方法。

还是那句话,克隆可能不是解决你问题的好方法,但我对你的用例了解不够,无法推荐任何方法。