克隆方法与java中的复制构造函数.哪一个是正确的解决方案.在哪里使用每个案例?
ArrayList<Integer> a=new ArrayList<Integer>();
a.add(5);
ArrayList<Integer> b=(ArrayList<Integer>)a.clone();
a.add(6);
System.out.println(b.toString());
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,我认为clone()是一个浅薄的副本.所以,b并a应指向同一个内存位置.但是,当我这样做时b.toString(),答案是唯一的5.6如果clone()浅拷贝,为什么也不显示?
有没有人在Java中有任何建议或建立的最佳实践和复制构造函数/工厂方法等的命名约定?特别是,假设我有一个类Thing,我希望某个方法返回一个Thing与Thing传入的值相同的新方法(如果它是实例方法,则返回实例).你有这个作为构造函数或静态工厂方法或实例方法?你会怎么称呼它?
根据标题,我想避免clone()和Cloneable.
克隆这种情况下的良好做法?怎么做得更好?
public ModelCollection startParsing() {
return parseFeed(new ModelSpecialEntry);
}
public ModelCollection parseFeed(ModelEntry pattern) {
ModelCollection modelCollection = new ModelCollection();
while( condition ) {
//TODO: Is cloning the best solution?
ModelEntry model = (ModelEntry) pattern.clone();
model.parse();
//add this item to an collection
modelCollection.add(model);
}
return modelCollection;
}
Run Code Online (Sandbox Code Playgroud) 有了2个ArrayList,我想知道将第一个转换成第二个的"副本"的最佳方法是
myFirstArray.clear();
myFirstArray.addAll(mySecondArray);
Run Code Online (Sandbox Code Playgroud)
要么
myFirstArray = mySecondArray.clone();
Run Code Online (Sandbox Code Playgroud)
这两种方法之间的主要区别是什么,哪种方法是优选的,还有另一种"更容易"或"更清洁"的解决方案.谢谢你的任何提示
编辑:我使用此副本替换当前使用的项目数组,我将在下一个循环中存储我将使用的项目.在循环结束时,我用我的futurArrayList替换了我的currentArrayList,并清除了我的futurArraylist以便在其中添加新项目(我希望它足够清晰)
我有两个java对象如下:
class A {
int a;
int b;
}
class B {
int a;
Double b;
}
A objA = new A();
objA.a = 5;
objA.b = 6;
Run Code Online (Sandbox Code Playgroud)
我想将objA克隆到objB中,以便当从objB访问时字段b转换为Double
objB.b = 6.0
objB.a = 5
Run Code Online (Sandbox Code Playgroud)
注意:
我正在为我的项目编写java中的遗传过程,我想模拟人类细胞的有丝分裂.人类细胞含有23对染色体.有丝分裂基本上是细胞分裂或繁殖,其中细胞产生两个遗传上相同的子细胞.你可以在这里找到一张相关图片(向下滚动一下):
我认为这种有丝分裂就像一个类"Cell"中的java方法.因此,我用它自己的方法制作了一个染色体类来代表单个染色体,并制作了一个包含23对染色体的"细胞"类.我计划将方法有丝分裂放在Cell类中,但问题是这个方法应该返回2个相同的单元格,我认为创建一个返回此类中2个单元格的方法是不可能的.我想过制作一个返回2个单元格数组的方法,它不起作用.有关如何创建此方法的任何建议?或者可能是另一种方法而不是我正在使用的方法?谢谢.
我已经编写了这个克隆方法,当Employee类的父类是抽象的,而父类中的clone()方法是abstract.I想用这个代码复制Employee的对象的原始数据类型,而不是复制每个原始数据单独键入,但此代码与我调用clone()方法的行有问题.(此代码在Employee类中)
public Object clone() {
Object obj = new Object();
Object object = obj.clone(); //Emphasis here
return object;
}
Run Code Online (Sandbox Code Playgroud)
错误是:Object类型的方法clone()不可见.
但是我的Employee类在类层次结构中,可以访问Object类中的protected clone()方法.
这是我简单的Employee类:
public class Employee extends Person implements Cloneable {
private int ID;
public Employee() {
ID = 0;
}
public void setID(int ID) {
this.ID = ID;
}
public int getID() {
return ID;
}
public Object clone1() throws CloneNotSupportedException {
try {
Object obj = new Object();
Object object = obj.clone();
return object;
} catch (CloneNotSupportedException ex) …Run Code Online (Sandbox Code Playgroud) I was reading this answer and he mentioned a link, where author explains why shouldn't we use Cloneable. But, still have doubt what was stated there
如果我有一个 Cloneable 数组,您会认为我可以运行该数组并克隆每个元素以制作该数组的深层副本,但我不能。您不能将某些内容强制转换为 Cloneable 并调用克隆方法,因为 Cloneable 没有公共克隆方法,而 Object 也没有。如果您尝试转换为 Cloneable 并调用克隆方法,编译器会说您正在尝试调用对象上受保护的克隆方法。
但是,我在这里做到了
Init s = Init.getInstance(); // getting instance
int count=0;
Cloneable[] v = new Cloneable[5]; // creating array
Init x = s;
Init y = new Init(s);
try {
while (count < 5) {
v[count++] = (Cloneable) s.clone(); // casting …Run Code Online (Sandbox Code Playgroud) 在代码中更容易解释,所以在这里
Object anObj;
anObj = new MyObj();
anObj = new Rectangle();
anObj.clone();//this doesnt exist because its on the root Object class
Run Code Online (Sandbox Code Playgroud)
在这个例子中,我可以用什么来代替 Object.clone() 方法?
----------------------- 额外信息 ------------------------- -----
我已经添加了额外的信息,但它似乎已经出现在所有答案的中间,所以它再次出现以便可以阅读。
嗨,所有这些对克隆或复制的主题都非常有帮助,我现在需要考虑一下。但他们对最初的问题没有帮助。也许我提供的更多信息将帮助您了解我的追求。
我正在覆盖每个对象的克隆,并添加完全克隆对象所需的所有其他克隆和复制方法,这包括添加自定义方法来复制缓冲图像。IE:-
public Object clone() {//i copied from 'thelost's answer
try {
CloningExample copy = (CloningExample)super.clone();
copy.names = (LinkedList)names.clone();
return copy;
} catch (CloneNotSupportedException e) {
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
但是我的类中有一个变量是一个对象,但是因为它包含不同类型的各种其他对象,所以我的每个类型都有一个 clone 方法,但是没有检查它是否是我的每个类型,然后调用 clone()我的类型会很长,因为我有很多类型,我看不到如何轻松复制或克隆对象。有没有办法让我只写一个像这样的静态方法?
static findTypeAndCopy(Object thisobj){
if(thisobj==null)
return null;
if(thisobj instanceOf MyObj1){
return ((MyObj1)thisobj).clone();
}else if(thisobj instanceOf MyObj2){
return ((MyObj2)thisobj).clone(); …Run Code Online (Sandbox Code Playgroud) Object类具有用于创建完全重复对象的clone方法.这个方法适用于每个类,但为什么我不能创建Object类的对象副本?这种行为背后有哪些Java概念?
我尝试了两种不同的情况,但它不起作用.它给出了编译时错误:Object类型的方法clone()不可见
Object o = new Object();
Object o2 = o.clone();
Object o = new Test(); // Some Test class
Object o2 = o.clone();
Run Code Online (Sandbox Code Playgroud)