Я пытаюсь скопировать содержимое ArrayList в другой и изменить содержимое копии. Я не хочу, чтобы это было отражено в оригинале.
Я проверил SO и внес соответствующие изменения, все та же проблема. Кто-нибудь может помочь? Я делюсь кодом ниже:
private ArrayList<CustVoiceListObject> FilterApprovedWorkFromList() {
ArrayList<CustVoiceListObject> arrayListCopy = new ArrayList<>(arrayListCustVoice);
for(int i =0; i<arrayListCopy.get(position).getPackageArray().size();i++)
{
if(!arrayListCopy.get(position).getPackageArray().get(i).getPackageApproved().equals("Y"))
{
arrayListCopy.get(position).getPackageArray().remove(i);
i--;
}
}
return arrayListCopy;
}
Во время отладки, когда он собирается вернуться, я проверяю исходный массив arrayListCustVoice
, но он также изменен аналогично arrayListCopy
Что мне не хватает?
ОБНОВЛЕНИЕ [В соответствии с предложениями][Этот вопрос не дублируется!]
Это мой модифицированный код:
private ArrayList<CustVoiceListObject> FilterApprovedWorkFromList() {
ArrayList<CustVoiceListObject> arrayListCopy = (ArrayList<CustVoiceListObject>) arrayListCustVoice.clone();
for(int i =0; i<arrayListCopy.get(position).getPackageArray().size();i++)
{
if(!arrayListCopy.get(position).getPackageArray().get(i).getPackageApproved().equals("Y"))
{
arrayListCopy.get(position).getPackageArray().remove(i);
i--;
}
}
return arrayListCopy;
}
На самом деле я применил Cloneable к своему исходному классу, но все же столкнулся с той же проблемой.
Обновление 2 [Заключение исследования]
Я наткнулся на эту ссылку
В моем случае есть 2 класса. Второй является подмножеством первого. Вставка ниже:
public class CustVoiceListObject implements Cloneable {
private String txtSource, txtCustComment, txtCustOk, txtRepeat;
private int numberOfPackages, complaintSerial;
private ArrayList<CustomerVoicePackageListObject> packageArray;
private Double totalAmount;
//getters & setters & constructors
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
Класс 2:
public class CustomerVoicePackageListObject implements Cloneable {
public String packageCategory;
public String packageName;
public String partUsageFlag;
public String laborUsageFlag;
public String status;
public String isApproved;
//getters & setters & constructors
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
.clone()
должен ссылаться на clone()
КЛАССА, а не где-либо еще. И если это правильно, это спровоцирует принятие мер по устранению исключения в соответствии с моей реализацией clone() в каждом отдельном классе.
Итак, вот что я сделал, изменил цикл for на это:
private CustVoiceListObject FilterApprovedWorkFromList() {
//Observe the change here. It's no more ArrayList, it's Class type
CustVoiceListObject arrayListCopy = null;
try {
arrayListCopy = (CustVoiceListObject) arrayListCustVoice.get(position).clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
for(int i =0; i<arrayListCopy.getPackageArray().size();i++)
{
if(!arrayListCopy.getPackageArray().get(i).getPackageApproved().equals("Y"))
{
arrayListCopy.getPackageArray().remove(i); //this is ArrayList<ClassType>. Nested class objects.
arrayListCopy.setTxtCustOk("OKOK"); //within the class
i--;
}
}
return arrayListCopy;
}
В результате изменения в packageArray отразились как в (неудача), так и в НО изменения в txtCustOk в базовом классе, измененные в копии, а не в оригинале (успех). Значит проблема в клонировании с помощью ArrayList
Итак, глубокое клонирование требует соблюдения следующих правил:
1.Не нужно отдельно копировать примитивы.
2. Все классы-члены в исходном классе должны поддерживать клонирование, а метод клонирования исходного класса в контексте должен вызывать super.clone() для всех классов-членов.
3. Если какой-либо класс-член не поддерживает клонирование, то в методе клонирования необходимо создать новый экземпляр этого класса-члена и скопировать все его атрибуты один за другим в новый объект класса-члена. Этот новый объект класса-члена будет установлен в клонированном объекте.
Итак, моя цель — избавиться от ArrayList и перенести эти элементы в этот класс. Это болезненно. Ищем легкую альтернативу.