final Object更改原始Object的值

时间:2016-07-14 05:35:35

标签: java android arraylist final

我有一个Contact的POJO课程,其中包含来自地址簿的联系人的姓名,电子邮件和照片。当活动开始时,我查询联系人并检索所有联系人并在ArrayList<Contact>中分配。此ArrayList用于显示RecyclerView列表中的所有联系人。

当用户点击它时,我打开一个弹出窗口,显示一个警告对话框,并在EditText中填写用户的姓名和电子邮件。用户可以编辑详细信息并保存。保存后,我将Contact对象添加到所选联系人列表的另一个ArrayList中。

当用户编辑某些联系信息并保存时,会出现问题。它还会更改所有联系人ArrayList中的原始联系人详细信息。

代码流程

存储数据的ArrayLists:

ArrayList<Contact> mContacts = new ArrayList<>(); // This is filled with contact data
ArrayList<Contact> mSelectedContacts = new ArrayList<>(); // Initially empty

当用户点击该联系人时,会显示弹出窗口以编辑联系人详细信息:

    @Override
    public void onBindViewHolder(ContactViewHolder contactViewHolder, final int position) {

        // Get the contact details at given position
        final Contact ci = contactList.get(position);

        ...

        contactViewHolder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                createNameEmailEditDialog(ci);    // Opens Popup
            }
        });

    }

创建弹出窗口的方法:

private void createNameEmailEditDialog(final Contact contact) {

        final AlertDialog.Builder alert = new AlertDialog.Builder(this);

        ...

        dialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                    contact.setName(String.valueOf(nameEditText.getText()));
                    contact.setEmail(String.valueOf(emailEditText.getText()));
                    mSelectedContacts.add(contact);
                    dialog.dismiss();
                    addViewToSeletedBar(contact);
            }
        });
    }

现在,在对话框关闭后,在RecyclerView列表中。我可以看到,编辑过的名称也反映在所有联系人列表中(mContacts ArrayList)。

我知道有一些硬性参考正在发生,但在哪里?它是final提供硬参考吗?或者使用createNameEmailEditDialog()致电final Contact ci会造成损害?还是其他什么?

我该如何预防?

1 个答案:

答案 0 :(得分:2)

您的参考contactfinal,这意味着参考不能指向其他任何内容。但contact实例本身并非不可变。对于参考类型final,不是immutable。尝试创建contact的防御性副本并将其传递给您的方法(如果您不想更改原始实例)。