2016-06-19 7 views
0

私はデータのコピーを作成しようとしています。引き数として渡されたオブジェクトを次のクラスのデータメンバ変数に割り当てようとしています(これまで試みたことを含みます)メンバ変数がクローン()メソッドを実装していることを確認

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が実際にはパラメータで渡され、参照渡しされていないもののコピーであることを確認する必要があります。

どうすればこの問題に取り組むことができますか?

N.B:これは抽象クラスであり、継承するクラスはこのコンストラクタを使用します。

答えて

1

まず、方法2は文法だけでなくロジックも間違っています。 JavaではすべてのクラスはObjectのサブクラスであり、Objectは保護されたclone()メソッドを持っているため、Cloneableを実装しているかどうかにかかわらず、保護されたclone()メソッドがあります。従ってsomeObject.getClassc().getMethod("clone")nullを返します。

あなたの方法は、クローン()メソッドが保護されているので、このようなリフレクションを使用して呼び出す必要があります。 About Java cloneable

//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); 

また、私はこの質問を見てみるべきだと思います。リンクに記載されているようなディープクローンと浅いクローンを使用することは、実装すべき習慣です。

関連する問題