在java类中克隆1个成员变量

在java类中克隆1个成员变量,java,clone,Java,Clone,我有一个包含多个成员变量的类,其中一个是DefaultTableModel。我的类构造函数使用MySQL结果集填充DefaultTableModel。我希望生成DefaultTableModel的精确副本,并将其存储为类中的另一个成员变量,以便在维护原始变量副本的同时编辑类中变量的副本 下面是我的课程大纲 public class MyClass() { int i; Boolean b; DefaultTableModel model; DefaultTabl

我有一个包含多个成员变量的类,其中一个是DefaultTableModel。我的类构造函数使用MySQL结果集填充DefaultTableModel。我希望生成DefaultTableModel的精确副本,并将其存储为类中的另一个成员变量,以便在维护原始变量副本的同时编辑类中变量的副本

下面是我的课程大纲

public class MyClass() {

    int i;
    Boolean b;
    DefaultTableModel model;
    DefaultTableModel model2;

    MyClass(ResultSet myRS) {
        //code to initialize i,b,model;
        //code to clone model and save as model2;
        //code to modify model2;
    }

    public DefaultTableModel getModels(String s) {
        //code that returns model or model2;
    }

}

我已经读了一些书,但还没有弄清楚如何在类中创建变量的精确副本。我知道我不能只做
model2=model通常,如果它是您自己的TableModel子类而不是
DefaultTableModel
,您可以通过使您的
TableModel
实现
Clonable
并通过调用
clone()
方法来获取副本

在使用
DefaultTableModel
实例时,您必须反过来执行以下操作:

不要创建单个
对象[]【】
向量
实例来将数据传递给
DefaultTableModel的构造函数,而是创建
对象[]【】
向量
的两个副本。使用这些工具,您可以创建具有相同内容的
DefaultTableModel
实例。

使用
clone()
方法创建要克隆的对象的精确副本。 要允许克隆,类必须实现接口
Cloneable
。然后您必须重写从您实现的接口克隆方法

小例子:

public class TableClass implements Cloneable {


    private DefaultTableModel model;


    @Override
    public Object clone() {
        DefaultTableModel cloned = null;
        try {
            cloned = (DefaultTableModel) super.clone();
        }
        catch (CloneNotSupportedException ex) {
            Logger.getLogger(TableClass.class.getName()).log(Level.SEVERE, null, ex);
        }
        return cloned;
    }
public class YourTableModel extends AbstractTableModel implements Cloneable {


    private static final String[] columnNames = {"URL", "Progress", "Size", "Status"};
    private static final Class[] columnClasses = {String.class, String.class, String.class, String.class};

    private List<T> yourData;

    @Override
        public Object clone() {
            YourTableModel cloned = null;
            try {
                cloned = (YourTableModel) super.clone();
            }
            catch (CloneNotSupportedException ex) {
                Logger.getLogger(TableClass.class.getName()).log(Level.SEVERE, null, ex);
            }
            return cloned;
        }

    @Override
    public Object getValueAt(int row, int col) {
        switch (col) {
            case 0:
                return yourData.getName();
            case 1:
                return yourData.getAge();
            case 2:
                return yourData.getAddress();
            case 3:
                return yourData.getSomethingElse();
        }
        return "";
    }

    @Override
    public int getColumnCount() {
        return columnNames.length;
    }

    @Override
    public int getRowCount() {
        return downloadList.size();
    }

    @Override
    public String getColumnName(int col) {
        return columnNames[col];
    }

    public Class getClassName(int col) {
        return columnClasses[col];
    }
}
由于
clone()
方法返回
对象的实例
,因此必须强制转换为对象的类型:
clone=(DefaultTableModel)super.clone()

这就是如何工作的
clone()
。现在,您可以实现自己的tableMode

基本示例:

public class TableClass implements Cloneable {


    private DefaultTableModel model;


    @Override
    public Object clone() {
        DefaultTableModel cloned = null;
        try {
            cloned = (DefaultTableModel) super.clone();
        }
        catch (CloneNotSupportedException ex) {
            Logger.getLogger(TableClass.class.getName()).log(Level.SEVERE, null, ex);
        }
        return cloned;
    }
public class YourTableModel extends AbstractTableModel implements Cloneable {


    private static final String[] columnNames = {"URL", "Progress", "Size", "Status"};
    private static final Class[] columnClasses = {String.class, String.class, String.class, String.class};

    private List<T> yourData;

    @Override
        public Object clone() {
            YourTableModel cloned = null;
            try {
                cloned = (YourTableModel) super.clone();
            }
            catch (CloneNotSupportedException ex) {
                Logger.getLogger(TableClass.class.getName()).log(Level.SEVERE, null, ex);
            }
            return cloned;
        }

    @Override
    public Object getValueAt(int row, int col) {
        switch (col) {
            case 0:
                return yourData.getName();
            case 1:
                return yourData.getAge();
            case 2:
                return yourData.getAddress();
            case 3:
                return yourData.getSomethingElse();
        }
        return "";
    }

    @Override
    public int getColumnCount() {
        return columnNames.length;
    }

    @Override
    public int getRowCount() {
        return downloadList.size();
    }

    @Override
    public String getColumnName(int col) {
        return columnNames[col];
    }

    public Class getClassName(int col) {
        return columnClasses[col];
    }
}
公共类YourTableModel扩展了AbstractTableModel实现了可克隆{
私有静态最终字符串[]columnNames={“URL”、“进度”、“大小”、“状态”};
私有静态最终类[]columnClasses={String.Class,String.Class,String.Class,String.Class};
私有列表数据;
@凌驾
公共对象克隆(){
YourTableModel=null;
试一试{
克隆=(YourTableModel)super.clone();
}
捕获(CloneNotSupportedException ex){
Logger.getLogger(TableClass.class.getName()).log(Level.SEVERE,null,ex);
}
返回克隆;
}
@凌驾
公共对象getValueAt(整数行,整数列){
开关(col){
案例0:
返回yourData.getName();
案例1:
返回您的数据。getAge();
案例2:
返回您的数据。getAddress();
案例3:
返回您的数据;
}
返回“”;
}
@凌驾
public int getColumnCount(){
返回columnNames.length;
}
@凌驾
public int getRowCount(){
返回downloadList.size();
}
@凌驾
公共字符串getColumnName(int-col){
返回列名[col];
}
公共类getClassName(int col){
返回列类[col];
}
}
通过这种方式,您可以实现自己的模型也克隆()方法,然后可以克隆这些对象。但也有其他方法,比如写@vizier


希望有帮助

我真的很感谢你的帮助。不过,我很难完全理解你在说什么。您介意将代码插入到我在原始问题中输入的示例类中应该位于的位置吗?谢谢。你想创建DefaultTableModel的副本,就像你写的(model2=model)一样,这只是一个对象,但是你想创建一个对象的两个精确副本,然后你可以做任何你想做的事情。这是如何使用clone()方法的示例。感谢您的帮助。我本想用克隆做一些更优雅的事情,但那就成功了。