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

时间:2012-05-18 15:34:49

标签: java clone

我有一个包含多个成员变量的类,其中一个是DefaultTableModel。我的类的构造函数使用MySQL ResultSet来填充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;,因为这只是复制变量的引用。我犯了这个错误,发现编辑model2也会编辑模型。我读到的关于克隆的所有内容都使得它似乎只是用于创建一个完整类的新的相同实例。关于如何在类中克隆单个变量的任何建议都将非常感激。

2 个答案:

答案 0 :(得分:1)

使用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;
    }

由于clone()方法返回Object的实例,您必须转换为对象的类型:cloned = (DefaultTableModel) super.clone()

这就是clone()的工作方式。现在您可以实现自己的tableMode。

基本示例:

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];
    }
}

这样你的实现你自己的模型也克隆()方法,然后你可以克隆这个对象。但也有其他方法,如写 @vizier

希望它有所帮助!

答案 1 :(得分:0)

通常,如果它是您自己的TableModel子类而不是DefaultTableModel,您可以通过调用TableModel实现Clonable来实现此clone()实现DefaultTableModel并获取副本。

当您使用Object[][]个实例时,您必须反过来执行此操作:

不是创建单个VectorDefaultTableModel实例来将数据传递给Object[][]的构造函数,而是创建VectorDefaultTableModel的两个副本。通过这些,您可以创建具有相同内容的两个{{1}}实例。