我正在尝试创建作为参数传递的数据对象的副本,并将其分配给以下类中的数据成员变量(包括我迄今为止尝试过的内容)
public abstract class AbstractVertex implements Vertex {
private String label;
private Object data;
public AbstractVertex(String label, Object data) {
this.label = label;
//What I've tried so far :
//Method #1
if(!(data instanceof Cloneable)){
throw new RuntimeException("data's class doesn't implement a custom clone method");
}
this.data = data.clone();
//Method #2 (Just to get the idea behind this method, syntax may be completely wrong)
if(( data.getClass().getMethod(clone()) ) == null){
throw new RuntimeException("data's class doesn't implement a custom clone method");
}
}
}
所以我的问题是我无法实现这些方法中的任何一个,因为 Object
类中的 clone()
方法受到保护。但由于我需要能够在 AbstractVertex
类中存储任何类型的数据,因此我绝对必须确保存储的 data
实际上是传入数据的副本参数并且不通过引用传递。
那么,我该如何解决这个问题呢?
注意:这是抽象类,继承类将使用这个构造函数。
最佳答案
首先你的方法2是错误的,不仅语法错误,而且逻辑错误。在java中,每个类都是Object
的子类,并且由于Object
有一个 protected clone()
方法,无论它们是否实现Cloneable
code> 或并非每个类都有 protected clone()
方法。因此 someObject.getClassc().getMethod("clone")
永远不会返回 null
。
对于方法 1,由于 clone() 方法受到保护,因此您需要使用反射来调用它,如下所示;
//Method #1
if(!(data instanceof Cloneable)){
throw new RuntimeException("data's class doesn't implement a custom clone method");
}
Method cloneMethod = data.getClass().getMethod("clone");
this.data = cloneMethod.invoke(data);
我认为你应该看看这个问题:About Java cloneable 。像链接中提到的那样使用深克隆和浅克隆是您应该实现的做法。
关于java - 验证成员变量是否实现了clone()方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37902941/