当前位置: 首页 > 知识库问答 >
问题:

现代可克隆的替代品?

邢硕
2023-03-14

众所周知,cloneable是无法修复的(有关更多信息,请参见本问题中的讨论)。

关于替代方案和“我如何做得对”的最后一个问题已经有几年的历史了:

    null
  • 类将实现的某种copyable接口:A扩展copyable.
  • 深度复制。如果a的istance引用B的实例,则a.copy()应引用新的B.copy().
  • 复制到指定的目标:A.copyTo(a1).
  • 多态复制:如果b扩展a,则a.copyto(b)应将b的所有属性从a复制到b

当然,我可以自己实现所有这些,但是有标准接口不是很合理吗?还是我漏掉了什么?

我的上下文的一点背景。我经常使用JAXB和模式派生类。对这些类进行深度复制通常非常有用。几年前,我编写了几个JAXB模式编译器插件来生成copyto方法,这些方法实现了上述(以及更多)需求。我不得不使用自己的运行时API。现在我正在重新审视这个案子,并决定问问是否有一个标准的解决方案

共有1个答案

任文乐
2023-03-14

我多次使用的机制是序列化/反序列化。当然,这只在所有对象和元素都是可序列化的情况下才起作用,所以并不是在所有情况下都起作用。如果所有的对象都是可序列化的,那么这是一种非常有效的深度复制对象的方法。可以这样做:

public class SerializationHelper {
public static byte[] serialize(Object object) throws IOException {
    ByteArrayOutputStream os = new ByteArrayOutputStream();
    new ObjectOutputStream(os).writeObject(object);
    return os.toByteArray();
}

@SuppressWarnings("unchecked")
public static <T> T deSerialize(byte[] array) throws IOException, ClassNotFoundException {
    return (T)new ObjectInputStream(new ByteArrayInputStream(array)).readObject();
}

@SuppressWarnings("unchecked")
public static <T> T clone(T object) {
    try {
        return (T)deSerialize(serialize(object));
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}
 类似资料:
  • 问题内容: 在游戏中,我有一个玩家列表,我们这样说: 我想让每个玩家与其他玩家互动,所以我写了两个嵌套循环: 由于我只希望每对玩家互动一次,因此我想在外循环的当前玩家之后与该玩家开始内循环。所以我想克隆迭代器,但是不能编译。 那么,我该怎么办呢? 问题答案: 将执行以下操作: 它依靠的能力从给定位置开始,并且还知道其当前位置。

  • 第一步: 进入Github克隆界面 如果我们想使用Github上的开源项目,可以使用Android Studio直接下载项目代码。 操作步骤: 第1步: 进入Github克隆界面 三个路径: 欢迎界面: Check out project from Version Control —> Github 菜单栏: File —> New —> Project from Version Control

  • 在较老一代的版本控制系统里,checkout是获取文件的标准操作。你将获得一组特定保 存状态的文件。 在Git和其他分布式版本控制系统里,克隆是标准的操作。通过创建整个仓库的克隆来获得文件。或者说,你实际上把整个中心服务器做了个镜像。凡是主仓库上能做的事, 你都能做。 封闭源码 闭源项目须避免执行touch命令,并确保你从未创建`git-daemon-export-ok`文件。资源 库不再可以通过

  • 假设我有这门课: 以及子类: 我知道这是不可能的,但我想你明白我想要什么。如果Foobar实现了Cloneable,并且没有扩展AbstractFoo,那么子类就可以工作。我想我想要但不允许的是: 如果Foobar实现了Cloneable,并且没有扩展AbstractFoo,那么子类就可以工作。 除了扩展的抽象类,我怎么能做到“相同”?

  • 我目前正在编写TensorFlow教程,需要下载源代码。当我运行时,我得到以下错误: 我正在我的家庭网络上工作,并且有最新版本的Git。 我尝试了以下命令,但没有成功: 有什么想法吗?

  • 问题内容: 很多年前我使用过XStream,但是我发现自2008年以来就没有更新这些库(最新消息)。现在是否有一个更现代且最新的Java XML序列化库? 问题答案: 按照偏好,相关性和活动的顺序: 访问JAXB项目的站点,以查看教程和指南。还可以查看原始的JAXB体系结构白皮书。 上面列出的JAXB项目是API的参考实现,并由GlassFish Application Server打包在其中。