2014-09-08 3 views
0

두 가지 전략으로 객체를 "복제"했습니다. CloneConstructor 및 복제 메서드입니다. (코드 아래) 복제 된 개체를 편집 한 후 "원본"개체도 편집됩니다. 내가 뭘 잘못 했니?java/android : 복제/복제 후에도 객체 편집

내 사용자 지정 개체

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()); 
    } 
} 

이제 내 활동에() editTicket() 다음 saveTABvalues을 호출 한 후, 세 개의 객체 데이터/editData2/editData3은 같습니다. 이 editData2 및 editData3에 대한 확인,하지만 난 ... "데이터"도 변경 이유를 이해 당신의 도움 당신은 공공 FormData에서 "데이터"에서 데이터를 전송하는

답변

1

(FormData oldData을위한

감사를 해달라고); 에서 editTicket(); 따라서 Edit2 또는 Edit3을 편집 할 때마다 데이터의 원래 값도 변경됩니다. clone() 메서드를 사용하거나 String (String) = new String (oldString)과 같이 새 Object (oldObject)를 사용해야합니다.

편집 :

내가 말할

는 "전송"내 말은 그냥 원래 값에 대한 참조를 할당한다. 그래서 당신은 공용 FormData (FormData oldData)에 nw 값을 생성하지 않습니다.

+0

답장을 보내 주셔서 감사합니다.하지만 나는 undestand를 사용하지 않습니다. 공용 FormData cloneFormData()에서 새 객체를 만들고 실제 값으로 채우고 반환합니다. public FormData (FormData oldData) 생성자가 자체적으로 새 객체를 생성하지 않습니까? 내 말은, 그것의 생성자는 ... –

0

바보 나 ... 내가해야 할

// clone Constructor 
public FormData(FormData oldData) { 
    requestId = new String(oldData.requestId.toString()); 
    stgFormDatenTransfer = new String (oldData.stgFormDatenTransfer.toString()); 
    values = new HashMap<String,Object>(oldData.values);   
} 

그냥 didnt한다 = 새로운 String (...)와 새로운 속성을 만들;

+0

그건 정확히 내가 썼던 것이다 :'[...] String s = new String (oldString); [...]'과 같은 새로운 Object (oldObject). 그러나 당신이 그것을 알아 낸 것을 기쁘게 생각합니다. – VonSchnauzer

관련 문제