Posso estar errado, mas tenho a impressão que vocês estão achando que estou pensando em banco de dados devido ao fato de querer colocar o “turmaAtual” na classe aluno. Mas eu apenas estou considerando esse item para facilitar recuperar as informações de turma através do aluno.
A remoção do “classeAtual” resolveria meu problema tambem, porem criaria outros… Se alguem tiver uma idéia melhor para este caso, por favor, me informem.
Não sou novato em OO, mas tambem não me considero um expert. Um dia chego la…
[quote=Arthur F. Ferreira][quote=ezidio]Gostei da idéia da classe Escola, realmente a divisão das resposabilidades fica melhor, pois a escola poderia escolher outra turma automaticamente.
Mas ainda fica a duvida: Como atualizar a turmaAtual dentro do aluno?
Seria uma boa idéia eu colocar tudo no mesmo pacote e colocar o setter como protected?
[quote=Arthur F. Ferreira]Eu acho que a matrícula é responsabilidade da escola. Vc não matricula seu filho numa turma. Vc matricula seu filho numa escola e a escola coloca em determinada turma de acordo com algum critério (número de alunos, vagas, idade, desempenho, etc.)
Porém, acho legal a Turma ser uma classe. Fica mais fácil e acessível para você informações como média da turma, quantidade de alunos, etc. Também não vejo problema em ter a informação da turma atual na classe Aluno, mas somente como consulta (somente getter). Não é certo alterar um atributo da turma ou acessar um comportamento através de Aluno.[/quote][/quote]
Basicamente, o que você quer seria algo desse tipo aqui:
Escola.java
public class Escola {
private List<Turma> turmas;
public Escola() {
this.turmas = new ArrayList<>();
}
public void matricula(Aluno aluno) {
Turma turma = turmas.get(turmas.size() - 1);
if (!turma.adiciona(aluno)) {
turma = new Turma();
turma.adiciona(aluno);
}
System.out.println("Aluno " + aluno.getNome() + " matriculado na turma " + turma.getNumero() + " com sucesso!");
}
public void mudaAlunoDeTurma(Aluno aluno, Turma novaTurma) {
Turma turmaAnterior = aluno.getTurma();
turmaAnterior.remove(aluno);
novaTurma.adiciona(aluno);
}
}
Turma.java
public class Turma {
private static final short MAXIMO_DE_ALUNOS = 50;
private static int contadorNumero = 0;
private int numero;
private List<Aluno> alunos;
public Turma() {
this.alunos = new ArrayList<>();
this.numero = contadorNumero++;
}
public boolean adiciona(Aluno aluno) {
if (MAXIMO_DE_ALUNOS > alunos.size()) {
this.alunos.add(aluno);
aluno.setTurma(this);
return true;
} else {
return false;
}
}
public int quantidadeDeAlunos() {
return this.alunos.size();
}
public int getNumero() {
return this.numero;
}
public void remove(Aluno aluno) {
this.alunos.remove(aluno);
}
}
Aluno.java
public class Aluno {
private String nome;
private float nota;
private Turma turma;
public Aluno(String nome) {
this.nome = nome;
}
public String getNome() {
return this.nome;
}
public Turma getTurma() {
return this.turma;
}
public void setTurma(Turma turma) {
this.turma = turma;
}
public float getNota() {
return this.nota;
}
public void setNota(float nota) {
this.nota = nota;
}
}
Porém, como o Sasaki falou, tem questões a serem resolvidas além do que você quer, como as que ele citou. Além disso, a pergunta do drsmachado é pertinente se você estiver pensando em trabalhar com banco de dados. Eu imagino que você esteja estudando com exemplos básicos para orientação objeto ainda, certo? Se for isso, esqueça (por enquanto) as questões de entidades, bancos de dados, tabelas, domino, controlador, etc. Foque no conceito e aprendizado da orientação a objeto. Depois que vc pegar isso, vc vai partir para essa questão de banco de dados, normalização, camadas, etc.[/quote]