2017-09-06 19 views
-1

私はメソッドの引数としてorg.codehaus.jettison.json.JSONArrayを渡し、メソッド内でそれを更新します(配列から要素を追加/削除します)。org.codehaus.jettison.json.JSONArrayは変更できませんか?

しかし、変更は発信者に反映されていません。ソースコードから、このクラスは不変ではないようです。私はコードの点で以下のようなことをしています。

String jsonArrayAsString; 
JSONArray ja = new JSONArray(jsonArrayAsString) 
myMethod(ja); 
// ja here remains unchanged 

public void myMethod(JSONArray jsonArray){ 
    JSONArray ja1 = JSONArray(); 
    jsonArray = ja1; 

} 
+0

'jsonArray = ja1;'は渡されたオブジェクトを変更しません** - ローカル変数を新しいオブジェクトに再割り当てします – UnholySheep

答えて

2

あなたは引数として渡されたjsonArrayオブジェクトに変更を加えていません。このコードスニペットでは、参照の値を変更しています。

myMethodの本文内では、jsonArrayは最初は引数として渡されたオブジェクトへの参照です。メソッドの2行目で、この参照を変更して新しく作成したオブジェクトja1を指すようにします。

Is Java "pass-by-reference" or "pass-by-value"?およびthis tutorial on method/constructor argumentsを参照してください。

あなたはmyMethodに渡すオブジェクトを変更するためには、あなたがプロパティを設定し、メソッドを呼び出すことによって、その状態を変更する必要がある、など

0

いいえ、org.codehaus.jettison.json.JSONArrayは不変ではありません。

jsonArray = ja1を実行すると、元のオブジェクトは変更されず、myMethodスコープ内のローカル参照のみが更新されます。

渡されたオブジェクトの変更を行うには、渡された参照でメソッドを呼び出すか、変更されたオブジェクトを返すことができます。

String jsonArrayAsString; 
JSONArray ja = new JSONArray(jsonArrayAsString) 
myMethod(ja); 
// ja now contains new object element 

ja = myMethod1(ja); 
// ja now points to a new JSONArray containing an elements from the original array with another additional element 

public void myMethod(JSONArray jsonArray){ 
    jsonArray.put(object); // this will add object to the original JSONArray 
} 

public JSONArray myMethod1(JSONArray jsonArray){ 
    JSONArray a = new JSONArray(); 
    a.put(jsonArray.get(0)); 
    a.put(object); 
    return a; 
} 

PS:参照がJavaでどのように機能するかを示す別の回答に記載されているリンクを参照してください。

関連する問題