gpt4 book ai didi

java - 验证成员变量是否实现了clone()方法

转载 作者:行者123 更新时间:2023-12-01 09:47:05 26 4
gpt4 key购买 nike

我正在尝试创建作为参数传递的数据对象的副本,并将其分配给以下类中的数据成员变量(包括我迄今为止尝试过的内容)

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com