论坛首页 Java版 企业应用

关于深度克隆(Deep Clone)

浏览 2163 次
精华帖 (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(父类)中去,而达到深度克隆的目的

}
   
最后更新时间:2008-05-27
这个问题很好呀!

我在开发中也遇到这样的问题。

看起来将方法封装与否并无大碍,其实在大规模的开发时就不一样了。

当开发组有20名程序员,每人写20个LZ所说的Bean,那么很难保证这400个Bean中的clone()方法都正确,因为你只能给大家一个示例,而不同Bean中clone()方法的内容要因它的属性而异的。

我也尚未有好办法,看看那位高手能给个方法!
   
0 请登录后投票
最后更新时间:2008-05-27
事项clone的接口不过为了能调用系统的clone,而该方法也不过浅度clone而已,如果要深度的,没必要一定要实现该接口
   
0 请登录后投票
最后更新时间:2008-05-28
感觉实现不了
如果父类可以实现子类的深度克隆 那么JDK本身早就在Object类上实现
咱们所有的类执行.deepClone()就完毕了
   
0 请登录后投票
最后更新时间:2008-05-30
应该可以实现的,不过需要你在BaseBean中做一些手脚
   
0 请登录后投票
最后更新时间:2008-05-31
最简单的办法可以采用序列化和反序列化来deep clone
   
0 请登录后投票
最后更新时间:2008-06-01
厌倦发呆 写道
最简单的办法可以采用序列化和反序列化来deep clone

这招倒是不错 尝试下看看
   
0 请登录后投票
最后更新时间:2008-06-02
为什么会有那么多的克隆操作,
如果一个系统存在这样的要求,可能存在严重的设计问题。
如果不是,那特定的地方应该是很有限的,不应该在基类中实现此类功能。
可参考类似Beanwrapper实现。
   
0 请登录后投票
最后更新时间: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;
       
    }
}  
   
0 请登录后投票
最后更新时间:2008-06-02
还是用序列化然后反序列化的方法比较实在。
   
0 请登录后投票
论坛首页 Java版 企业应用

跳转论坛:
JavaEye推荐