相关疑难解决方法(0)

Java:深度克隆/复制实例的推荐解决方案

我想知道是否有推荐的方法在java中进行深度克隆/复制实例.

我有三个解决方案,但我可以错过一些,我想得到你的意见

编辑:包括Bohzo的提议和改进问题:它更多的是深度克隆而不是浅层克隆.

自己做:

在属性之后通过hand属性编写克隆代码并检查是否也克隆了可变实例.
亲:
- 控制将要执行的操作
- 快速执行
缺点:
- 编写和维护繁琐
- 容易出错(复制/粘贴失败,缺少属性,重新分配的可变属性)

使用反射:

使用您自己的反射工具或外部帮助程序(如jakarta common-beans),可以轻松编写一个通用的复制方法,该方法可以在一行中完成工作.
亲:
- 易于编写
- 没有维护
缺点:
- 对发生的事情的控制较少
- 如果反射工具也没有克隆子对象,则容易出现可变对象的错误
- 执行速度较慢

使用克隆框架:

使用为您执行此操作的框架,例如:
commons-lang SerializationUtils
Java Deep Cloning Library
Dozer
Kryo

亲:
- 与反思一样
- 更多地控制将要克隆的内容.
缺点:
- 即使在层次结束时,每个可变实例都被完全克隆
- 执行起来可能非常慢

使用字节码检测在运行时编写克隆

javassit,BCELcglib可能用于生成专用克隆器,只需单手写入.为此目的,有人知道使用这些工具之一的lib吗?

我错过了什么?
你会推荐哪一个?

谢谢.

java clone

173
推荐指数
4
解决办法
13万
查看次数

.clone()或Arrays.copyOf()?

为了减少可变性,我们应该使用

public void setValues(String[] newVals) {

     this.vals = ( newVals == null ? null : newVals.clone() );
}
Run Code Online (Sandbox Code Playgroud)

要么

public void setValues(String[] newVals) {

     this.vals = ( newVals == null ? null : Arrays.copyOf(newVals, newVals.length) );
}
Run Code Online (Sandbox Code Playgroud)

java immutability

41
推荐指数
2
解决办法
4万
查看次数

克隆多维数组

int[][] array = new int[][] {...}
int[][] clone = array.clone();
Run Code Online (Sandbox Code Playgroud)

我天真地期待这个工作.但它没有 - 它只克隆了第一个维度,如果我想要一个真正的克隆,我必须手动克隆另一个维度.注意:内容已正确复制.但是,当我改变时clone[0][1],它反映在array[0][1]

虽然.clone()已知执行浅层克隆,但int[][]看起来像一个对象(如果我们不知道它的内部实现,至少)

为什么选择这种行为?是不是int[][]引用数组对象,而不仅仅是数组的第一个维度?在什么情况下只克隆第一个维度所需的行为?

java

17
推荐指数
1
解决办法
2679
查看次数

有效的Java声称elements.clone()就足够了

我正在阅读Joshua Bloch的Effective Java,第2版,第11项:明智地覆盖克隆.

在第56页,他试图解释当我们覆盖clone()某些类(如集合类)时,我们必须复制它的内部.然后他给出了设计课程的例子Stack:

public class Stack {
    private Object[] elements;
    private int size = 0;
    private static final int DEFAULT_INITIAL_CAPACITY = 16;
    public Stack() {...}
    public void push(Object e) {...}
    public Object pop() {...}
    private void ensureCapacity() {...} //omitted for simplicity
}
Run Code Online (Sandbox Code Playgroud)

他声称如果我们只是super.clone()用来克隆a Stack,那么生成的Stack实例"将在其size字段中具有正确的值,但是其elements字段将引用与原始Stack实例相同的数组.修改原始将破坏不变量克隆,反之亦然.您将很快发现您的程序产生无意义的结果或抛出NullPointerException." 现在看起来很公平.但他接着举了一个"正确实施"的例子,这让我很困惑:

@Override public Stack clone() {
    try {
        Stack result = (Stack) super.clone();
        result.elements = elements.clone();
        return result;
    } catch (CloneNotSupportedException e) …
Run Code Online (Sandbox Code Playgroud)

java

8
推荐指数
2
解决办法
181
查看次数

克隆与Java中的复制数组?

我有这些代码,我正在制作一个数组的副本.使用System.arraycopy似乎比...更冗长clone().但两者都给出了相同的结果.一个优于另一个有什么优势吗?这是代码:

import java.util.*;
public class CopyArrayandArrayList {
    public static void main(String[] args){
        //Array copying
    char[] copyFrom = { 'd', 'e', 'c', 'a', 'f', 'f', 'e'};
    char[] copyTo = new char[7];

    System.arraycopy(copyFrom, 0, copyTo, 0, 7);

    char[] copyThree = new char[7];
    copyThree=copyFrom.clone();
}
}
Run Code Online (Sandbox Code Playgroud)

java arrays clone copy

5
推荐指数
1
解决办法
2万
查看次数

标签 统计

java ×5

clone ×2

arrays ×1

copy ×1

immutability ×1