|
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
|---|---|
| 作者 | 正文 |
|
最后更新时间:2008-05-21 关键字: java
我有一个父类,实现了 Cloneable 接口,作为基本Bean。这个父类在项目开发时,会被业务上的Bean继承之。
业务Bean中可能会定义一些非Java标准类型的成员变量,如数组、ArrayList、Hashtable、其他业务Bean等。 我想问的问题是,可否仅在这个基础的Bean中写个克隆方法,而各个业务Bean中无需复写clone,就实现深度克隆呢?
class BaseBean implements Cloneable {
private String commonInfo;
public String getCommonInfo(){
return commonInfo;
}
public void setCommonInfo(String commonInfo){
this.commonInfo = commonInfo;
}
@overwrite
public object clone(){
super.clone();
。。。。。。?// 为了不在业务Bean中复写clone方法,需要在这里如何处理呢?invoke ??
}
}
class StaffBean extends BaseBean{
private String staffCode;
private String staffName;
//省略public get / set 方法
}
class DepartmentBean extends BaseBean{
private String departmentCode;
private String departmentName;
private int staffCount;
priate StaffBean[] staffs; // 自定义类型的数组
//省略public get / set 方法
// 目的是不在此处复写clone方法,将代码转至基本Bean(父类)中去,而达到深度克隆的目的
}
声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
|
| 返回顶楼 | |
|
最后更新时间:2008-05-27
这个问题很好呀!
我在开发中也遇到这样的问题。 看起来将方法封装与否并无大碍,其实在大规模的开发时就不一样了。 当开发组有20名程序员,每人写20个LZ所说的Bean,那么很难保证这400个Bean中的clone()方法都正确,因为你只能给大家一个示例,而不同Bean中clone()方法的内容要因它的属性而异的。 我也尚未有好办法,看看那位高手能给个方法! |
|
| 返回顶楼 | |
|
最后更新时间:2008-05-27
事项clone的接口不过为了能调用系统的clone,而该方法也不过浅度clone而已,如果要深度的,没必要一定要实现该接口
|
|
| 返回顶楼 | |
|
最后更新时间:2008-05-28
感觉实现不了
如果父类可以实现子类的深度克隆 那么JDK本身早就在Object类上实现 咱们所有的类执行.deepClone()就完毕了 |
|
| 返回顶楼 | |
|
最后更新时间:2008-05-30
应该可以实现的,不过需要你在BaseBean中做一些手脚
|
|
| 返回顶楼 | |
|
最后更新时间:2008-05-31
最简单的办法可以采用序列化和反序列化来deep clone
|
|
| 返回顶楼 | |
|
最后更新时间:2008-06-01
厌倦发呆 写道 最简单的办法可以采用序列化和反序列化来deep clone
这招倒是不错 尝试下看看 |
|
| 返回顶楼 | |
|
最后更新时间:2008-06-02
为什么会有那么多的克隆操作,
如果一个系统存在这样的要求,可能存在严重的设计问题。 如果不是,那特定的地方应该是很有限的,不应该在基类中实现此类功能。 可参考类似Beanwrapper实现。 |
|
| 返回顶楼 | |
|
最后更新时间:2008-06-02
如果真的需要,可以这么搞
class StaffBean extends BaseBean{
private String staffCode;
private String staffName;
public String[] getAllFieldNames(){
//..获取所以定义的字段
}
public Object getFieldValue(String fieldName){
//..取值
}
public void setFieldValue(String fieldName,Object o){
//..赋值
}
public Object clone() {
BaseBean bean = (BaseBean) getClass().newInstance();
String[] fieldNames = getAllFieldNames();
//循环{
bean.setFieldValue(fieldNames[i],
getFieldValue(fieldNames[i]));
}
return bean;
}
}
|
|
| 返回顶楼 | |
|
最后更新时间:2008-06-02
还是用序列化然后反序列化的方法比较实在。
|
|
| 返回顶楼 | |









