2012-04-02 12 views
1

オブジェクトXのリストを含むオブジェクトXがあります。 リストにループを作成し、リストからオブジェクトXをインテントを通じて別のアクティビティに渡します。アクティビティを介して複合オブジェクト参照を渡す

他の活動では、私はこのオブジェクトXを変更し、私は戻って私の最初の活動でのオブジェクトXを取得すると、この変更されたオブジェクトX.

を返し、私はこの点は大丈夫です、それは修正されています見ることができます。

しかし、ルートオブジェクトX(オブジェクトXのリストを含むもので、変更されたオブジェクトXからのものです)は、インテントへの参照を渡すだけでなく、変更するべきではありませんか?

もしそうでなければ、他のオブジェクトXの中のオブジェクトXの根の深さがどのように変更されているのでしょうか?

(私には十分明確ではないことを教えてください)。

ありがとうございました。 私は私のオブジェクトは(それがシリアライズとParcelableないという事実の注意を払っていない、私はこの後のを修正します)、より正確には、別の活動を通じて

を送信し、オブジェクトのXとの活性を有する:

public class CategoryBean implements Externalizable, Cloneable { 
    public static final boolean ACTIVE = true; 
    public static final boolean INACTIVE = false; 

    public static final int VALIDATED = 1; 
    public static final int NON_OBSERVED = 2; 
    public static final int IN_PROGRESS = 3; 
    public static final int PARTIEL = 4; 

    private String perimetre; 
    private CategoryBean parentCategory; 
    private List<CategoryBean> categoryList = new ArrayList<CategoryBean>(); 
    protected String title; 
    /** 
    * Category validée ou non 
    */ 
    protected int state; 
    /** 
    * Category active ou inactive 
    */ 
    protected boolean activated = ACTIVE; 

    // public CategoryBean(Parcel in) { 
    // this.parentCategory = in.readParcelable(CategoryBean.class.getClassLoader()); 
    // this.categoryList = Arrays.asList(in.readParcelableArray(CategoryBean.class.getClassLoader())); 
    // this.title = in.readString(); 
    // } 

    /** 
    * @return the parentCategory 
    */ 
    public CategoryBean getParentCategory() { 
     return parentCategory; 
    } 

    /** 
    * @return the perimetre 
    */ 
    public String getPerimetre() { 
     return perimetre; 
    } 

    /** 
    * @param perimetre 
    *   the perimetre to set 
    */ 
    public void setPerimetre(String perimetre) { 
     this.perimetre = perimetre; 
    } 

    /** 
    * @param parentCategory 
    *   the parentCategory to set 
    */ 
    public void setParentCategory(CategoryBean parentCategory) { 
     this.parentCategory = parentCategory; 
    } 

    /** 
    * @return the category 
    */ 
    public List<CategoryBean> getCategoryList() { 
     return categoryList; 
    } 

    /** 
    * @param category 
    *   the category to set 
    */ 
    public void setCategoryList(List<CategoryBean> categoryList) { 
     this.categoryList = categoryList; 
    } 

    /** 
    * @return the title 
    */ 
    public String getTitle() { 
     return title; 
    } 

    /** 
    * @param title 
    *   the title to set 
    */ 
    public void setTitle(String title) { 
     this.title = title; 
    } 

    /** 
    * @return the state 
    */ 
    public int getState() { 
     return state; 
    } 

    /** 
    * @param state 
    *   the state to set 
    */ 
    public void setState(int state) { 
     this.state = state; 
    } 

    /** 
    * @return the activated 
    */ 
    public boolean isActivated() { 
     return activated; 
    } 

    /** 
    * @param activated 
    *   the activated to set 
    */ 
    public void setActivated(boolean activated) { 
     this.activated = activated; 
    } 

    @Override 
    public int hashCode() { 
     return parentCategory.hashCode() + categoryList.hashCode() + title.hashCode(); 
    } 

    @SuppressWarnings("unchecked") 
    @Override 
    public void readExternal(ObjectInput input) throws IOException, ClassNotFoundException { 
     setPerimetre((String) input.readObject()); 
     setParentCategory((CategoryBean) input.readObject()); 
     setCategoryList((List<CategoryBean>) input.readObject()); 
     setTitle((String) input.readObject()); 
     setState((Integer) input.readObject()); 
     setActivated((Boolean) input.readObject()); 
    } 

    @Override 
    public void writeExternal(ObjectOutput output) throws IOException { 
     output.writeObject(getPerimetre()); 
     output.writeObject(getParentCategory()); 
     output.writeObject(getCategoryList()); 
     output.writeObject(getTitle()); 
     output.writeObject(getState()); 
     output.writeObject(isActivated()); 
    } 

    @Override 
    public CategoryBean clone() throws CloneNotSupportedException { 
     try { 
      CategoryBean clone = (CategoryBean) super.clone(); 
      clone.setPerimetre(clone.getPerimetre()); 
      clone.setParentCategory(clone.getParentCategory()); 
      clone.setCategoryList(clone.getCategoryList()); 
      clone.setTitle(clone.getTitle()); 
      clone.setState(clone.getState()); 
      clone.setActivated(clone.isActivated()); 
      return clone; 
     } catch (CloneNotSupportedException e) { 
      throw new InternalError(); 
     } 
    } 

    @Override 
    public String toString() { 
     StringBuilder sb = new StringBuilder("(CategoryBean -> "); 
     sb.append(" perimetre : "); 
     sb.append(getPerimetre()); 
     sb.append(" parentCategory : "); 
     sb.append(getParentCategory() != null ? getParentCategory().getTitle() : null); 
     sb.append(" categoryList : "); 
     sb.append(getCategoryList()); 
     sb.append(" title : "); 
     sb.append(getTitle()); 
     sb.append(" state : "); 
     sb.append(getState()); 
     sb.append(" activated : "); 
     sb.append(isActivated()); 
     sb.append(")"); 
     return sb.toString(); 
    } 
} 
+0

定義 'オブジェクトXのリストを含むオブジェクトX' –

+0

@サミール私の質問を更新しました – Nico

答えて

2

一般的にJavaで可能であっても、参照によって変更することはお勧めしません。数千行のコードと同じプロジェクトに取り組んでいるいくつかの開発者がいる開発段階の後半には明らかになるいくつかの欠点があります。リスト項目が魔法のように変更された理由は誰でも不思議に思っています:

変更したオブジェクトをリストに置き換えてリストに戻しておくことをお勧めします。あなたがしなければならないのは、インデックスを追跡することだけです。

set(int index, Object element) 
     Replaces the element at the specified position in this list with the specified element. 

EDIT: も低い結合とモジュールの観点からクリーンなアプローチであろう

は、Listインタフェースの設定方法を使用します。したがって、1つのアクティビティは別のアクティビティに依存せず、特定のタスクに再利用できます。

あなたの正確な質問に答えるには:Androidがアイテムを複製するか、コピー/新しく作成されたアイテムのシリアル化により、上記の理由により参照渡しされなかったと思います。

+0

ありがとうございました。私は完全なパスを追跡すると思います。 – Nico

+0

あなたが意図して渡した場合、アンドロイドはあなたの参照を尊重しません。代わりに、それはあなたのオブジェクト編集の深さの1つ以上の層を持っている場合、ちょっと迷惑な項目を複製します。 –

関連する問題