No exercício proposto no curso na Aula 06 (Aplicando o Set no modelo) fiz uma variação do código a fim de reduzir a quantidade de linhas do programa, mas me deparei com a seguinte situação: inclui dois objetos com os mesmos dados do aluno para ver o set eliminar o ítem duplicado, e para minha surpresa, ele não eliminou.
Teria isso ocorrido porque trata se de instâncias/referências diferentes?
package br.com.caelum.collections;
public class TestaClasseAlunos {
public static void main(String[] args) {
Curso curso = new Curso("Java", "Girafales");
curso.adiciona(new Aula("Eclipse", 20));
curso.adiciona(new Aula("Hello World", 20));
curso.adiciona(new Aula("Arrays", 20));
curso.adiciona(new Aula("Collections", 20));
curso.matricula(new Aluno("Fagner", 1234));
curso.matricula(new Aluno("Marcos", 1235));
curso.matricula(new Aluno("Maria", 1236));
curso.matricula(new Aluno("Maria", 1236));
System.out.println(curso);
}
}
A saída ficou assim:
[ Curso: Java, tempo total: 80, aulas: + [[Aula: Eclipse, 20], [Aula: Hello World, 20], [Aula: Arrays, 20], [Aula: Collections, 20]], alunos: [[Nome: Maria, Matricula: 1236], [Nome: Fagner, Matricula: 1234], [Nome: Marcos, Matricula: 1235], [Nome: Maria, Matricula: 1236]] ]
Abaixo segue a classe Curso:
package br.com.caelum.collections;
import java.util.Collections;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
public class Curso {
private String nome;
private String instrutor;
private List<Aula> aulas = new LinkedList<>();
private Set<Aluno> alunos = new HashSet<>();
Curso(String nome, String instrutor){
this.nome = nome;
this.instrutor = instrutor;
}
public final String getNome() {
return nome;
}
public final void setNome(String nome) {
this.nome = nome;
}
public final String getInstrutor() {
return instrutor;
}
public final void setInstrutor(String instrutor) {
this.instrutor = instrutor;
}
public final List<Aula> getAulas() {
return Collections.unmodifiableList(this.aulas);
}
public void adiciona(Aula aula) {
this.aulas.add(aula);
}
public int getTempoTotal() {
int tempoTotal = 0;
for (Aula aula : aulas) {
tempoTotal += aula.getTempo();
}
return tempoTotal;
}
public final Set<Aluno> getAlunos() {
return Collections.unmodifiableSet(this.alunos);
}
public void matricula(Aluno aluno) {
this.alunos.add(aluno);
}
public boolean estaMatriculado(Aluno aluno) {
return this.alunos.contains(aluno);
}
@Override
public String toString() {
return "[ Curso: " + this.getNome() + ", tempo total: " + this.getTempoTotal()
+ ", aulas: + " + this.aulas + ", alunos: " + this.getAlunos() + " ]";
}
}