在java类中克隆1个成员变量
我有一个包含多个成员变量的类,其中一个是DefaultTableModel。我的类构造函数使用MySQL结果集填充DefaultTableModel。我希望生成DefaultTableModel的精确副本,并将其存储为类中的另一个成员变量,以便在维护原始变量副本的同时编辑类中变量的副本 下面是我的课程大纲在java类中克隆1个成员变量,java,clone,Java,Clone,我有一个包含多个成员变量的类,其中一个是DefaultTableModel。我的类构造函数使用MySQL结果集填充DefaultTableModel。我希望生成DefaultTableModel的精确副本,并将其存储为类中的另一个成员变量,以便在维护原始变量副本的同时编辑类中变量的副本 下面是我的课程大纲 public class MyClass() { int i; Boolean b; DefaultTableModel model; DefaultTabl
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的所有内容都让人觉得它只是用来创建整个类的一个新的、相同的实例。任何关于如何在类中克隆单个变量的建议都将不胜感激。通常,如果它是您自己的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()方法的示例。感谢您的帮助。我本想用克隆做一些更优雅的事情,但那就成功了。