Два разных объекта HashSet затронуты одной командой (JAVA) - PullRequest
0 голосов
/ 24 апреля 2019

У меня есть пользовательский объект:

Класс (id, код, название, номерOfECTSPoints, руководитель, преподаватель, учащийся, набор учеников)

Я создаю экземпляр этого пользовательского объекта с именем class1 и использую предварительно созданный HashSet для подачи в его конструктор. После того, как я это сделаю и очищу HashSet, который использовался для создания объекта, HashSet внутри объекта также будет очищен.

Set<Student> setStudents= new HashSet<Student>(); // this was fed with some Student objects

Class class1 = new Class(id, code, title, numberOfECTSPoints, headProfessor, attendingStudentsSet);

System.out.println(setStudents.size()); // 5
System.out.println(class1.getAttendingStudentsSet().size()); // 5
setStudents.clear();
System.out.println(setStudents.size()); // 0
System.out.println(class1.getAttendingStudentsSet().size()); // 0

Я ожидал, что набор внутри созданного объекта останется нетронутым, очистив набор, который использовался для подачи в конструктор объекта.

1 Ответ

0 голосов
/ 24 апреля 2019

Проблема в том, что это НЕ два разных HashSet - это один и тот же HashSet. Каждое поле или переменная типа класса на самом деле не является объектом этого типа - на самом деле это просто ссылка на объект этого типа, и когда вы присваиваете его (или передаете его какому-либо методу), вы на самом деле просто передаете ссылка на тот же базовый объект, не копируя объект.

Если вам нужны отдельные объекты, вам нужен явный new или clone() в вашем коде. В вашем случае вы могли бы сделать

Class class1 = new Class(id, code, title, numberOfECTSPoints, headProfessor, setStudents->clone());

или вы можете поместить вызов clone() в конструктор Class.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...