【问题标题】:cloning 1 member variable within a java class [duplicate]在java类中克隆1个成员变量[重复]
【发布时间】:2012-05-18 15:34:48
【问题描述】:

我有一个包含多个成员变量的类,其中一个是 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也会编辑model。我读到的所有关于 clone 的东西都让人觉得它只是用来为整个类创建一个新的、相同的实例。任何有关如何在类中克隆单个变量的建议将不胜感激。

【问题讨论】:

    标签: java clone


    【解决方案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];
        }
    }
    

    通过这种方式,您可以实现自己的模型也可以使用 clone() 方法,然后您可以克隆这些对象。但也有其他方法,例如写 @vizier

    希望对你有帮助!

    【讨论】:

    • 非常感谢您的帮助。不过,我很难准确理解你在说什么。您介意将您的代码插入我在原始问题中放置的示例类中的位置吗?谢谢。
    • 你想创建 DefaultTableModel 的副本,就像你写的那样引用 (model2 = model) 这只是一个对象,但你想创建一个对象的两个精确副本,然后你可以做想做什么。这是如何使用 clone() 方法的示例。
    【解决方案2】:

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

    当您使用 DefaultTableModel 实例时,您必须反其道而行之:

    创建Object[][]Vector 的两个副本,而不是创建一个Object[][]Vector 实例来将数据传递给DefaultTableModel 的构造函数。使用这些,您可以创建具有相同内容的两个 DefaultTableModel 实例。

    【讨论】:

    • 感谢您的帮助。我希望使用 clone 来做一些更优雅的事情,但这确实完成了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-26
    • 1970-01-01
    • 2012-06-26
    • 2012-02-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多