org.codehaus.jettison.json.JSONArray 是不可变的吗?

Is org.codehaus.jettison.json.JSONArray Immutable?

我将 org.codehaus.jettison.json.JSONArray 作为参数传递给方法,并在方法中更新(数组中的 add/remove 个元素)它。

但是调用者没有反映出变化。从源代码来看,class 似乎不是不可变的。我在代码方面做了如下的事情。

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

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

}

您没有改变作为参数传递的 jsonArray 对象。您在此代码段中所做的是更改引用的值。

myMethod 的正文中,jsonArray 最初是对作为参数传递的对象的引用。在该方法的第二行中,您将此引用更改为指向新构造的对象 ja1.

参见 Is Java "pass-by-reference" or "pass-by-value"? and this tutorial on method/constructor arguments

为了改变你传递给myMethod的对象,你需要通过调用一个方法,设置一个属性等来改变它的状态

不,org.codehaus.jettison.json.JSONArray 不是不可变的。

执行jsonArray = ja1时,原始对象保持不变,仅更新 myMethod 范围内的本地引用。

要对传递的对象进行更改,您可以根据传递的引用调用方法或return修改后的对象。

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:请仔细阅读另一个答案中提到的 link,其中显示了引用在 Java 中的工作方式。