2009-09-01 3 views
-1
class MetaData { 
    public String version; 
    public String compression; 
} 

私はMetaDataオブジェクトを作成し、それをメソッドに渡し、メソッド内からバージョンと圧縮フィールドを埋めます。そして、私はこれらの変更がメソッドの存続期間外に存在することを望みます。 C++では、&などを追加してオブジェクト自体を渡し、メソッドのコピーはコピーしないと思います。いつもJavaで同じことをすることはありますか?オブジェクト自体をメソッドに渡して実際に変更される方法はありませんか?

+3

この質問は逆のようです。このオブジェクトを関数に渡し、関数がバージョンと圧縮を変更すると、新しい値が呼び出し側に表示されます。変更を不可視にするのは、MetaData参照を新しい値に変更した場合です。 – Jay

+0

まあ、残念ながら、そうではありません。ありがとう。 – sepiroth

答えて

17

これは常にJavaで発生します。それはJavaの仕組みです。メソッドに "MetaData"オブジェクトを渡すと、そのオブジェクトへの参照が渡され、 "バージョン"と "圧縮"フィールドに加えられた変更はどこにでも見えるはずです。

http://www.javaworld.com/javaworld/javaqa/2000-05/03-qa-0526-pass.html

5

Java has pass by value semantics

は本当に、詳細な説明は、この記事をチェックしてください。これは、オブジェクトが値によってメソッドに渡されるわけではありません。むしろ、オブジェクトへの参照が値によってメソッドに渡されることを意味します。

このシナリオでは、MetaDataオブジェクトを作成し、フィールドに値が設定されているメソッドに渡すと、そのオブジェクトへの参照がそのメソッドに渡されます。メソッドが戻ったら、呼び出し元のオブジェクト参照を調べてフィールドが設定されていることを確認できます。

ところで、これはオブジェクトの状態を設定するためにMetaDataオブジェクトを別のクラスに送信している場合、OOPでは悪い方法です。オブジェクト自体は自分の状態を担当する必要があります。

4

これはJavaのデフォルトの動作です。

class Example { 
    public static void doit(MetaData data) { 
    data.compression = "Testing" 
    } 

    public static void main(String[] args) { 
    MetaData data = new MetaData(); 
    doit(data); 
    System.out.println(data.compression); 
    } 
} 
1

メソッドに渡す変更可能なオブジェクトはすべて変更でき、元のものは変更されます。問題は、Stringは変更できないということです。これは不変です。

変更可能なオブジェクトを渡します。

"version"を変更する場合は、クラス "MetaData"に.setVersion()メソッドを渡し、メソッドに "MetaData"を渡します。あなたのメソッドは、metaData.setVersion( "I'm NEW")を呼び出します。誰もが幸せになるでしょう。あなたが行うことができない何

public void willWorkFine (Metadata metaData) { 
    metaData.setVersion("Changed!"); 
} 

文字列を期待するメソッドに渡す「バージョン」であり、それを再割り当て:

public void wontWork(String changeMe) { 
    changeMe="not changed!"; 
} 

はchangemeは、オリジナルの「バージョン」を単なるローカル参照であるので、ローカル参照を別のオブジェクトを指すように再割り当てしても、外部プログラムには影響しません。

関連する問題