FastJSONとクローン

1208 ワード

アリババのオープンソースキットFastJSONはJSONデータを処理するときにとても使いやすいですが、私が最近実習で使っていたとき、コピーの問題という非常に簡単な落とし穴を見つけました.例として、
  • 例えばJsonオブジェクトaは
  • です
    JSONObject a = new JSONObject();
    a.put("key1","value1");
    
  • それから私はaの値と同じ新しいJSONオブジェクトが必要で、直接new
  • を発見することができます
    JSONObject b = new JSONObject(a);
    
  • それからaの中の値を修正して、bのも
  • 変わったことを発見します
    a.put("key1","value2");
    System.out.println(b.getString("key1");
    //output : value2
    

    ソースコードをめくると、JSONObjectはMapインタフェースを実現し、中にはデータを格納するメンバー変数mapがある.そこで私のnew文はこのように実現しました.
    public JSONObject(Map map){
        this.map = map;
    }
    

    これは元のオブジェクトaのmap参照をbに伝えただけで,2つのJSONオブジェクトのmapは1つのものである.では、私が望む結果をどのように実現するのでしょうか.そうだ、クローンだ.JSONObjectクラスはcloneableインタフェースのclone方法を実現した:
    @Override
    public Object clone() {
        return new JSONObject(new HashMap(map));
    }
    

    ここは確かにnewが新しいHashMapを作って、それを使ってnewが新しいJSOnObjectを私たちにくれたことがわかります.正しい書き方:
    JSONObject b = (JSONObject)a.clone(); 
    

    一言で言えば、HashMapの内部コンテナは配列で、ここでnew HashMap(map)は新しいHashMapを作成し、mapのキー値のペアを自分の配列に配置します.