对JSONArray参数中嵌套对象的修改不会粘贴

时间:2017-06-23 12:17:49

标签: java reference parameter-passing

考虑以下代码

private static boolean noHashClash(JSONArray ja,String hash,long epoch,long 
stay)
{
 int i,diff,len = ja.length();
 String oHash;
 JSONObject pjo;
 try
 {
  for(i=0;i < len;i++)
  {
   pjo = ja.optJSONObject(i);
   oHash = pjo.optString("hash","");
   if ((null == pjo) || (0 == oHash.length())) continue;
   diff = TLSH.totalDiff(hash,oHash,false);
   if (Geo.hashBlur > diff) 
   {    
    pjo.accumulate("ats",epoch);
    pjo.accumulate("stays",stay);
    int times = pjo.optInt("times",0);
    pjo.put("times",times + 1);
    return false;
   } 
  }
  return true;  
 } catch(Exception e)
 {
  Feedback.recordError(Utils.errorString(e));
  return true;
 } 
}

我在这里做的是将哈希值与JSONArray中对象的哈希值进行比较。如果哈希&#34;匹配&#34;找到(模糊)函数返回false。在此之前,它会修改匹配的对象 - 行

pjo.accumulate("ats",epoch);
....
pjo.put("times",times + 1);

惠斯特这个编译并正确运行,当我保存然后检索JSONArray时,我发现更改没有卡住。我的理解是Java通过值传递函数参数,其中&#34;值&#34;对象参数是实际对象本身。这意味着我对函数内部的对象属性所做的任何更改都应该坚持下去,而这确实会发生。那么为什么嵌套对象显然在这里被区别对待。我怀疑在我对Java中这些东西是如何工作的理解方面存在差距。我非常感谢能够提供帮助的任何人。

1 个答案:

答案 0 :(得分:0)

我有点惊讶的是,读到这个问题的人并没有发现这里的问题。我在这里留下了必要的解释,所以它可以帮助其他遇到这个线程的人。

问题的核心在于我正在修改本地引用到嵌套对象。

pjo = ja[i]
.....
.....
pjo.accumulate(...

要使这些更改成为传递的JSONArray参数的一部分,您还必须执行

ja[i] = pjo;

一旦退出例程,没有它就会丢失更改。 Java似乎有自己独特的处理对象参数的方式,这一点并不明显 - 至少在我的Delphi,C和PHP背景下不是这样。