2011-12-21 9 views
2

私はクラス(リテラル)を持っています。私は、アプリケーション全体を通してメモリに無傷のリテラルインスタンスを保持できるようにする必要があり、私が変更できるコピーを持っている必要があります。私はこれを行うには、2つの方法を使用していますオブジェクトのJavaディープコピーを作成するにはどうすればよいですか?

  1. クラスLiteralCloneableを実装し、Object.clone()メソッドをオーバーライドします。
  2. 工場コンストラクタ:コピーが動作しない、両方のケースで

    public Literal(Literal lit){ 
        this = lit; 
    } 
    

。私がコピーに加えるすべての変更は、オリジナルを変更します。誰かが私が間違っていることを知っていますか? Literal以来

+0

のような何かをする必要があるだろうが唯一の浅いcopying.checkは、http、このポストであります://stackoverflow.com/questions/64036/how-do-you-make-a-deep-copy-of-an-object-in-java –

+3

Javaで作業することはできますか? * Factoryコンストラクタ*(通常はこれをコピーコンストラクタ*と呼びます)の2回目の試みはコンパイルエラーになります。 "最終変数thisに値を代入することはできません" –

答えて

1

copy-constructorを使用する場合は、すべての可変メンバー変数の詳細コピーを作成する必要があります。

このようなメンバ変数があるあなたのリテラルは言う:

private String[] args; 
private String s; 

を次に、あなたのコピーコンストラクタは、あなたが何をして、この

public Literal(Literal l) { 
    // have to deep copy the array, otherwise both instances are sharing the reference 
    this.args = Arrays.copyOf(l.args, l.args.length); 

    // safe to just copy the reference, String is immutable 
    this.s = l.s; 
} 
+0

ありがとうございます!これは本当に助けた – nkatz

+0

あなたは大歓迎です。あなたはどういうことを言っていますか?[ここで質問するにはどうすればいいですか?](http://stackoverflow.com/faq#howtoask) – sudocode

5

が整数型ではない、タイプLiteralの変数は、実際の値に参照、そうthis = litだけのコピーを参照するので、あなたの行動を保持しています。

「実」コピーを実行するには、すべてのメンバーフィールドを再帰的にコピーする必要があります。

このarticleは、彼のコメントでUmeshによってリンクされた質問に受け入れられた回答でリンクされています。あなたの問題で抱いている概念的な問題をクリアしていると思います。

+0

実際に私は持っていますが、私の実際のコンストラクタはpublicです。Literal(Literal lit){ \t \t this.functor = lit.getFunctor(); \t \t this.arguments = lit.getArguments(); \t \t this.isCompound = lit.isCompound(); \t \t this.isVarOrConst = lit.isVarOrConst(); \t \t this.varOrconstName = lit.getVarOrconstName(); \t \t this.arity = lit.getArity(); \t \t this.subsumedBy = lit.getSubsumedBy(); \t \t this.asString = lit.getLiteralAsString(); \t} – nkatz

+0

あなたはメンバーのフィールドが非整数型の場合にも同じ効果が発生するので、**再帰的に**行う必要があります。 – akappa

+0

この質問の答えをチェックしてください:http://stackoverflow.com/questions/1175620/in-java-what-is-a-shallow-copy – akappa

関連する問題