2010-12-06 10 views
0

javaの関数に値で可変オブジェクトを渡す方法はありますか?可変オブジェクトを値でjavaに渡す方法

私が実際に望むのは、オブジェクトをメソッドに渡し、その上でいくつかの操作を行い(変更する)、そのメソッドをその古いオブジェクトだけで(変更された値ではなく)呼び出します。ここ

は、いくつかのサンプルです:このコードの終わりに

{ MyObj obj = new MyObj(); obj.setName("name"); 

    append(obj); 
    System.out.println(obj.name); 

    prepend(obj); 
    System.out.println(obj.name); 

    } 

    void append(MyObj obj){ obj.name+="1"; } 

    void prepend(MyObj obj){ String a = "1"; obj.name=a+obj.name; } 

、私のように出力したい:

name1 
1name 
+0

オブジェクト*が変更されている場合にのみ、その出力が得られますか?あなたは 'println' *の最初の呼び出しの後でのみ、付加された" 1 "*を無視したいことを何か知りたいと思いますか? –

+0

私が知りたいことはthatsです。どうやってやるの? – Anand

答えて

4

自体はJavaで全く渡されていないオブジェクト。これまで

しかし、すべてが渡されます。渡すことができるのはプリミティブな値と参照だけです。

あなたがしようとしていることははっきりしていません - (例えば)StringBuilderというパラメータを持つメソッドを持っていて、メソッド内からオブジェクトに加えられた変更は表示されないようにしたいという考え方です発信者に?その場合は、基本的にオブジェクトを自分で複製する必要があります。

+0

絶対に正しいですが、OPが役に立たないと思ったので、私はそれを自分で指摘しませんでした。 :)私は実際には一種のものではない。 ;) –

+1

@Karl:オブジェクトモデルを理解する(そして、ある参照型の変数を持っている場合、その変数の値はオブジェクトではなく参照型である)、Javaでは、IMOの中核をなすのは絶対的なコアです。私はこの話題では非常に気難しいです:) –

+0

Jon Skeetにはまだ投票がありませんか?奇妙な! :)(2分後に...)気にしないで...彼は1つを持っています! :) –

1

なぜこれを行う必要がありますか?オブジェクトを変更しないと、問題はありません。オブジェクトを変更して呼び出し元のオブジェクトに影響を与えたくない場合は、をコピーしてをローカルに作成してください。しかし私は、人々がそれをする必要があると思う時間の少なくとも90%を、彼らは本当にしないと思います。

いくつかのコードを表示します。あなたは何ですか本当にするのですか?

+0

はい、私はメソッド内のオブジェクトを変更したい、変更を外部に反映させたくない。どのようにコピーを作成しますか?そのコピーはオブジェクトの参照のコピーになりますか? – Anand

+0

コピーとは、「オリジナルと同じ値を表す完全に新しいオブジェクト」の意味です。どのようにするかは、クラス定義に依存します。これはあなたが考えて実装する必要がある(難しくありません)。実装が完了したら、それを 'clone()'と呼ばれるメンバ関数にして、 'Clonable'インタフェースを実装すると主張することができます。 –

+0

'Cloneable'は' Object'クラスでprotectedとして定義されているので、すべてのオブジェクトに対して実装できません。クラスでそれをオーバーライドする必要があります。クラスがJavaライブラリクラスの場合は、それも不可能になります。 – Anand

2

残念ながら、 Java 決してはオブジェクトを値渡しし、オブジェクトの参照を値渡しします。 hereから

説明: - 決して値で - と 参照は、実際に、値によって を渡されている

本当に何が起こっているが オブジェクトは常に、Javaの参照 によって保持されているということです。

+3

Javaはオブジェクトを完全に停止させることはありません。値渡しで参照を渡します。あなた自身の見積も​​りに矛盾しないでください。 ;)それは違いを生む。参照によってオブジェクトを実際に渡していた場合は、C++で 'std :: swap'に相当するものを実装することができます。 –

+0

@Karl Knechtel、ええ、私は自分自身と矛盾していました...更新しました。 –

+0

残念ながら?? –

-2

AFAIK不変/可変性は、値/参照渡しには関係しません。文字列は、値ではなく参照によって渡されます。文字列を不変にするのは、文字列クラス自体の設計です。 おそらく、あなたが探しているものをもう少し説明するかもしれません。

+0

参照による値の受け渡しと参照による渡しの区別についての他のコメントを参照してください。 –

+0

YEah私は言葉のコピーを参照しています。この質問を私にとって重要なものにするのは、免疫可能な対象物に関する質問です。 – Peposh

+0

これは不変で免疫不能です。 –

関連する問題