gpt4 book ai didi

Java:如何复制一个对象,使其来自同一个子类?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:00:12 24 4
gpt4 key购买 nike

我尝试使用一个简单的示例来更好地理解:我有一个类 Tool 和扩展类 Tool 的子类:Hammer。两者都定义了一些字段,如 weight,并且都用自己的实现覆盖方法 getCost

    Tool first_tool = new Hammer();
Tool second_tool = new Saw();

我需要 Tool 类中的一个方法,它将复制任何工具,这样,first_tool_copy 来自与 first_tool 相同的子类。我怎样才能使这成为可能?我需要这样的东西:

    /* Copy tool, change parameters of copy, the original won't change */
/* first_tool_copy will be instance of Hammer class */
first_tool_copy = first_tool.copy
first_tool_copy.weight = 100

结论:我希望有一些对所有子类通用的简单复制构造函数。

最佳答案

对于这种情况可能有很多解决方案,但我相信最简单的一种是使用反射来创建克隆对象并将字段从原始对象复制到副本。这段代码的唯一要求是您的子类必须有一个默认构造函数,但这看起来不像是一个真正的问题。

这是它的样子:

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Tool implements Cloneable {

private String name;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

@Override
public Object clone() {

try {

Tool instance = this.getClass().newInstance();

List<Field> fields = new ArrayList<Field>();

Class<?> kind = this.getClass();

while ( kind != null ) {
fields.addAll( Arrays.asList( kind.getDeclaredFields() ) );
kind = kind.getSuperclass();
}

for ( Field field : fields ) {
field.setAccessible(true);

int mod = field.getModifiers();

if ( !Modifier.isStatic( mod ) && !Modifier.isFinal( mod ) && !Modifier.isNative(mod) ) {
Object value = field.get( this );
field.set(instance, value);
}

}

return instance;

} catch (Exception e) {
throw new UnsupportedOperationException(e);
}

}

}

这是你的子类,没有任何特殊之处:

public class Saw extends Tool {

private int weight;

public int getWeight() {
return weight;
}

public void setWeight(int weight) {
this.weight = weight;
}

}

还有一个 JUnit 测试用例展示了它是如何工作的:

public class SawTest {

@Test
public void testClone() {

Saw original = new Saw();
original.setName("Some saw");
original.setWeight( 10 );

Saw clone = (Saw) original.clone();

Assert.assertTrue( original != clone );
Assert.assertTrue( original.getClass().equals( clone.getClass() ) );
Assert.assertEquals( original.getName(), clone.getName() );
Assert.assertEquals( original.getWeight(), clone.getWeight() );

}

}

关于Java:如何复制一个对象,使其来自同一个子类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7058234/

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