Duvida sobre Orientação a Objetos

[quote=Rodrigo Sasaki]eu não gostei do aluno.setTurma(this); pois mantém um acoplamento alto entre as classes.

Agora respondendo sua pergunta, sim, eu entendi que você não está falando de banco de dados, e acho que a sua solução pode ser interessante, mas você deve pensar nos casos que eu te falei, senão pode ter alunos duplicados em turmas e/ou alunos em turmas diversas, e com certeza você não quer isso.

Ao matricular um aluno, como garantir que ele não está matriculado em outra turma? Mais cedo ou mais tarde você terá que varrer as turmas.[/quote]

Eu penso que o “turmaAtual” faria o trabalho de garantir que ele esteja em uma unica turma. Ao tentar adicionar em outra turma, o sistema verificaria se a turma é diferente e atualiza o campo dentro de aluno. Existe esse problema do alto acoplamento, que para resolver precisaria percorrer todas as turmas, mas por enquanto manterei da seguinte forma, se surgir algo melhor eu refatoro:

public class Turma {
private Set<Aluno> alunos = new HashSet<Aluno>();

public boolean adiciona(Aluno a) {
    if (this.podeMatricular(a)) {
        a.setTurmaAtual(this);
        this.alunos.add(a);
        return true;
    } else {
        return false;
    }
}

public boolean podeMatricular(Aluno a) {
   // validações no aluno
}
}

Só mude o método podeMatricular de public para private e um “melhor” nome para esse método seria validar

Eu acho que esse método pode ser public mesmo, pois isso possibilita algumas outras utilizações, como no loop a seguir:

public List<Aluno> alunosQuePodemEntrarNaTurma(List<Aluno> alunos, Turma turma) {
    List<Aluno> permitidos = new ArrayList<Aluno>();
    for (Aluno aluno : alunos) {
        if (turma.podeMatricular(aluno)) {
            permitidos.add(aluno);
        }
    }
    return permitidos;
}