ざっくりメモですが
public class DataHolder{ public String sample; }
みたいに変数保持クラスを作った時に、
dataholder_1.sample = "hello"; dataholder_2 = dataholder_1; dataholder_1.sample = "bye"; Log.e("sample",dataholder_2.sample);//1にいれたはずのbyeが出る!!
みたいに、1のデータを2に入れました。複製しました。だけど、片方を変更すると、もう片方も変更しちゃう。
っていう状況になってしまいます。
これは参照を渡してしまっているので、これが発生しないようにするには、すべての変数に関して、複製をしなくてはいけないのですが、これも面倒くさいのですが、cloneを実装する事で、別に出来ます。
public class DataHolder implements Cloneable { String sample; public DataHolder(){ } public DataHolder clone(){ try { DataHolder dataHolder = (DataHolder)super.clone(); return dataHolder; }catch (Exception e){ return null; } } }
こんな感じで、
dataHolder_2 = dataholder_1.clone();
ってすると、参照を渡すのではなく、複製する事ができます。
で、ここで複製はできるのですが、
ArrayListとかをHolderの内部に持っている場合とかは、さらに参照の問題が起こります。
もともとの問題が、変数って結局は参照してるだけって事だったので、
変数を内部に持っているのではなく、変数を参照しているものを内部で持っているのが、今回作った、DataHolderだったのですが、ArrayListもほぼ同じで、変数への参照をしてるクラスになります。
なので、ArrayListを複製しても、参照先は変わりません。なので、cloneの中でまたcloneをするっていう。
dataHolder.strList = (ArrayList<String>) ((DataHolder)super.clone()).arraylist.clone();
みたいな、複製を別に作っていくっていう、少し面倒な事があります。
なので、複製は面倒臭いので、うまい方法で回避する事が一番の解決方法だったりしますね。