Java добавляет объект в неправильный вектор (он даже не написан в коде, который должен) - PullRequest
0 голосов
/ 09 июня 2019

Предположим, у нас есть 1 класс с именем GroupOfStudents, у которого есть одно свойство с именем vectorOfStudents. Итак, этот класс выглядит так:

public class GroupOfStudents{
    public Vector<Student> vectorOfStudents = new Vector<Student>();   
    public GroupOfStudents(Vector<Student> vectorOfStudents) {
        this.vectorOfStudents = vectorOfStudents;
    }
}

Хорошо, просто, верно? Кроме того, у нас есть один класс с именем Student, и, скажем, в нем просто указано имя студента.

public class Student {
    public String name;
    public Student(String name) {
        this.name = name;
    }
}

Теперь давайте создадим 2 группы без учеников.

Vector<Student> emptyVectorOfStudents = new Vector<Student>();
GroupOfStudents group1 = new GroupOfStudents(emptyVectorOfStudents);    
GroupOfStudents group2 = new GroupOfStudents(emptyVectorOfStudents); 

И, конечно, давайте приведем group1 например 1 ученика по имени "Люк".

Student student1 = new Student("Luke");
group1.vectorOfStudents.add(student1);

Пусть вторая группа останется пустой. Когда я хочу вывести имена студентов обеих групп, по какой-то причине group2 также имеет student1 в своем векторе.

for(Student s: group1.vectorOfStudents) {
    System.out.print("Name: " + s.name + " ");
}
System.out.println("");
for(Student s: group2.vectorOfStudents) {
    System.out.print("Name: " + s.name + " ");
}

Вывод:

Name: Luke
Name: Luke

И это должно быть:

Name: Luke (because second group has no students)

Любая причина, почему это происходит?

Ответы [ 2 ]

2 голосов
/ 09 июня 2019

это даже не написано в коде, что он должен

Да, это так, здесь:

Vector<Student> emptyVectorOfStudents = new Vector<Student>();
GroupOfStudents group1 = new GroupOfStudents(emptyVectorOfStudents);    
GroupOfStudents group2 = new GroupOfStudents(emptyVectorOfStudents); 

Оба group1 и group2 используют тот же Вектор.Если вы хотите, чтобы у них были отдельные векторы, задайте им отдельные векторы:

GroupOfStudents group1 = new GroupOfStudents(new Vector<Student>());    
GroupOfStudents group2 = new GroupOfStudents(new Vector<Student>()); 

Обратите внимание, что ваш код GroupOfStudents создает вектор, уже находящийся в разработке, но затем отбрасывает его, чтобы использовать тотон получает в качестве параметра конструктора:

public class GroupOfStudents{
    // Creates a new Vector when an instance is created
    public Vector<Student> vectorOfStudents = new Vector<Student>(); 
    public GroupOfStudents(Vector<Student> vectorOfStudents) {
        // Throws away the Vector created above and uses the one from the parameter instead
        this.vectorOfStudents = vectorOfStudents;
    }
}

Вероятно, лучше всего просто отбросить параметр и вообще не передавать вектор:

public class GroupOfStudents{
    public Vector<Student> vectorOfStudents = new Vector<Student>(); 
    public GroupOfStudents() {
    }
}

или

public class GroupOfStudents{
    public Vector<Student> vectorOfStudents; 
    public GroupOfStudents() {
        this.vectorOfStudents = new Vector<Student>();
    }
}
0 голосов
/ 09 июня 2019

Прежде всего, вы уверены, что хотите использовать Vector? документация самого Vector гласит:

Если поточно-ориентированная реализация не требуется, рекомендуется использовать ArrayList вместо Vector.

Во-вторых, если вы хотите передать Collection в класс (ы) конструктора, вы можете скопировать Collection s перед сохранением их в локальном поле (например, через Collections.copy(...)). Java API неоптимально разработан здесь. Не все Collection определяют конструктор копирования, и Cloneable не является опцией . Поэтому мы должны работать с тем, что у нас есть. Но эй! Если бы все было легко, было бы скучно, не так ли? :)

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