【发布时间】:2014-09-08 14:58:18
【问题描述】:
我用两种不同的策略“克隆”了一个对象。 CloneConstructor 和克隆方法。 (代码如下) 编辑克隆对象后,“原始”对象也被编辑。 我做错了什么?
我的自定义对象
public class FormData {
HashMap<String, Object> values;
String stgFormInstanceId, requestId, stgFormDatenTransfer;
// Constructor for creating data with WebService
public FormData(SoapObject so, StgForm form) {....}
// Constructor for creating new data
public FormData() {....}
// clone Constructor
public FormData(FormData oldData) {
this.requestId = oldData.requestId;
this.stgFormDatenTransfer = oldData.stgFormDatenTransfer;
this.stgFormInstanceId = oldData.stgFormInstanceId;
this.values = oldData.values;
this.toString();
}
// Clone Method
public FormData cloneFormData() {
FormData newData = new FormData();
newData.requestId = this.requestId;
newData.stgFormDatenTransfer = this.stgFormDatenTransfer;
newData.stgFormInstanceId = this.stgFormInstanceId;
newData.values = this.values;
newData.toString();
return newData;
}
public void addValue(String key, Object value) {
this.values.put(key, value);
}
}
我的活动:
public class DetailActivity extends ActionBarActivity implements
ActionBar.TabListener {
private static HashMap<String, StgField> fields;
private ActionBar actionBar;
private FormData data;
private FormData editedData;
private String instanceId, requestId;
private ViewPager viewPager;
private TabsPagerAdapter mAdapter;
private static ViewMode viewMode;
private static ArrayList<EditText> editTextList;
private StgForm currentForm;
private Context context;
private FormData editedData2;
private FormData editedData3;
@Override
protected void onCreate(Bundle savedInstanceState) {
...
data = ....;
}
private void editTicket() {
setViewMode(ViewMode.edit);
editedData2 = new FormData(data);
editedData3 = data.cloneFormData();
setEditabilityOfFields(fields, true);
getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}
private void saveTabValues(int position) {
ArrayList<StgField> fields = getFieldsOfTAB(position);
for (StgField field : fields) {
View view = field.getViewItem();
if (view instanceof EditText) {
EditText et = (EditText) view;
String fieldName=field.getFieldName();
Editable value = et.getText();
String s = value.toString();
try {
editedData2.addValue(fieldName,
s);
} catch (Exception e) {}
try {
editedData3.addValue(fieldName,
s);
} catch (Exception e) {}
}
}
System.out.println(data.toString());
System.out.println("-------------");
System.out.println(editedData2.toString());
System.out.println("-------------");
System.out.println(editedData3.toString());
}
}
现在,在我的 Activity 中调用 editTicket() 和 saveTABvalues() 之后,所有三个对象 data / editData2 / editData3 是一样的。这对editData2和editData3来说没问题,但我不明白,为什么“数据”也发生了变化……
感谢您的帮助
【问题讨论】: