我尝试使用一个简单的例子来更好地理解:我有一堂课Tool
以及正在延伸班级的子班Tool
: Hammer
, Saw
。两者都定义了一些字段,例如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() );
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)