Solucionado (ver solução)
Solucionado
(ver solução)
12
respostas

Não entendi o exercício

Não entendi muito bem o exercício e o resultado não saiu como o esperado. Fiz minha implementação da seguinte forma:

package br.com.alura;

import java.util.Set;

public class TestaCursoComAluno {

    public static void main(String[] args) {

Curso javaColecoes = new Curso ("Dominando as coleções do Java", "Paulo Silveira");


        javaColecoes.adiciona(new Aula("Trabalhando com ArrayList", 21));
        javaColecoes.adiciona(new Aula("Criando uma Aula", 20));
        javaColecoes.adiciona(new Aula("Modelando com coleções", 24));

        Aluno a1 = new Aluno ("Rodrigo Turini", 34672);
        Aluno a2 = new Aluno ("Guilherme Silveira", 5617);
        Aluno a3 = new Aluno ("Maurício Aniche", 17645);

        javaColecoes.matricula(a1);
        javaColecoes.matricula(a2);
        javaColecoes.matricula(a3);

        Set<Aluno> alunos = javaColecoes.getAlunos();
        Aluno a4 = new Aluno ("Renato Areas", 1011);

        System.out.println("Todos os alunos matriculados: ");
        javaColecoes.getAlunos().forEach(aluno ->{
            System.out.println(aluno);
        });

    }

}

Resultado:

Todos os alunos matriculados: 
[Aluno: Rodrigo Turini, matrícula: 34672]
[Aluno: Maurício Aniche, matrícula: 17645]
[Aluno: Guilherme Silveira, matrícula: 5617]

Podem me Ajudar ???

12 respostas

Boa noite Renato.

O que você não entendeu do exercício?

O seu forEach está sendo feito a partir da referência: "javaColecoes" que aponta para o obj Curso(Curso javaColecoes) que por sua vez invocou o método "adiciona" que adiciona uma Aula,(criada dentro da invocação do método(

javaColecoes.adiciona(new Aula("Trabalhando com ArrayList", 21));

)), após isso você criou os objetos do tipo Alunos e os matriculou através do método "matricula" da classe Curso(matriculou os alunos a1, a2 e a3), após isso adicionou os alunos que estavam criados no Set, depois criou um outro Aluno(a4) e fez um forEach nos alunos que estavam matriculados.

O que você pode ter achado estranho é que não mostrou o objeto da referência a4, correto? Isso aconteceu pois o obj foi criado, porém o mesmo não foi matriculado no curso(

javaColecoes.matricula(?faltou matricular ele aqui?))

logo o curso não conhece esse aluno e como o seu forEach foi feito" em cima dos alunos que o curso conhece", ele não retornou esse obj.

Quanto ao Set, você apenas adicionou os Alunos que o Curso conhece(a1, a2, a3), acredito que fez essa ação a fim de evitar dados duplicados na coleção, porém essa coleção não está sendo utilizada e mesmo que fosse retornado a coleção de obj que ela conhece, o aluno a4 não seria retornado pois você adicionou na coleção Set os Alunos que o Curso conhecia e novamente o Curso não conhece o Aluno a4.

Sou novo no Java mas espero ter te ajudado e/ou dado uma luz.

Att, Roberto.

Boa Noite Roberto, tudo bem ! Cara muito obrigado pela sua explicação, porém, minha dúvida ainda persiste. Entendi a parte que você explicou que eu criei o obj aluno a4 e não o tinha matriculado ( eu ate tinha comentado essa parte do código), então assim fiz

// código otimizado

        Aluno a1 = new Aluno ("Rodrigo Turini", 34672);
        Aluno a2 = new Aluno ("Guilherme Silveira", 5617);
        Aluno a3 = new Aluno ("Maurício Aniche", 17645);
        Aluno a4 = new Aluno ("Renato Areas", 1011);

        javaColecoes.matricula(a1);
        javaColecoes.matricula(a2);
        javaColecoes.matricula(a3);
        javaColecoes.matricula(a4);

        Set<Aluno> alunos = javaColecoes.getAlunos();

        System.out.println("Todos os alunos matriculados: ");
        javaColecoes.getAlunos().forEach(aluno ->{
            System.out.println(aluno);
        });

agora vem novamente a dúvida, já criei e obj a4 e o matriculei no curso, fiz o forEach e não caiu a exceção, o aluno foi matriculado e impresso no console. É ai que está a minha dúvida, porque não deu erro ?

Oi Renato tudo bem?

Estou estudando Java também (to na parte 2) então não sei muito também e venho acompanhando a sua pergunta desde o início (ossos do ofício) mas não entendi porque você acha que daria erro nesse último código?

Fala André, bom dia !

E porque na resposta do professor está dizendo que cairia em uma exceção e não está caindo.

=/

Oi Renato bom dia!

Entendi. Vai dar exception se tentar adcionar com o metodo add conforme o professor disse no começo da página:

"No método main da classe a seguir, tente adicionar mais um aluno no nosso Set de alunos utilizando o método add() :"

A sim ! Agora eu entendi ! Mas vamos lá, como o Paulo explicou, o método add já existe na interface Set do pacote java.util, correto ? ai vem mais uma dúvida, abaixo da linha de código

Set<Aluno> alunos = javaColecoes.getAlunos();

fiz o seguinte código

javaColecoes.add (a4);

porém o código não compila, e pede para eu implementar o método add na classe Aluno. O código está da seguinte forma

public class TestaCursoComAluno {

    public static void main(String[] args) {

Curso javaColecoes = new Curso ("Dominando as coleções do Java", "Paulo Silveira");


        javaColecoes.adiciona(new Aula("Trabalhando com ArrayList", 21));
        javaColecoes.adiciona(new Aula("Criando uma Aula", 20));
        javaColecoes.adiciona(new Aula("Modelando com coleções", 24));

        Aluno a1 = new Aluno ("Rodrigo Turini", 34672);
        Aluno a2 = new Aluno ("Guilherme Silveira", 5617);
        Aluno a3 = new Aluno ("Maurício Aniche", 17645);
        Aluno a4 = new Aluno ("Renato Areas", 1011);

        javaColecoes.matricula(a1);
        javaColecoes.matricula(a2);
        javaColecoes.matricula(a3);
        javaColecoes.matricula(a4);

        Set<Aluno> alunos = javaColecoes.getAlunos();

        javaColecoes.add (a4);                

        System.out.println("Todos os alunos matriculados: ");
        javaColecoes.getAlunos().forEach(aluno ->{
            System.out.println(aluno);
        });

    }

Classe Aluno

public class Aluno {

    private String nome;
    private int numeroMatricula;

    public Aluno (String nome, int numeroMatricula) {
        this.nome = nome;
        this.numeroMatricula = numeroMatricula;
    }

    public String getNome() {
        return nome;
    }
    public int getNumeroMatricula() {
        return numeroMatricula;
    }

    @Override
    public String toString() {
        return "[Aluno: " + this.nome + ", matrícula: " + this.numeroMatricula + "]";
    }

Não entendi também, mas como disse estou aprendendo Java. Vou procurar alguém para te ajudar!!!

Tranquilo ! A curva de aprendizado é assim mesmo, e como o Paulo mesmo diz e complicado de entender mesmo temos que praticar bastante.

Obrigado André ! =)

Disponha!

Sim temos que praticar bastante. Eu quando enrosco em uma aula vou fazer algum outro curso pra relaxar, tipo aqueles de soft skill ou então fazer outra coisa. E quando vejo meu cérebro vem com a resposta.

Verdade !

E a melhor coisa !

solução!

Oi Renato, tudo bom?

Só confirma uma coisa pra mim, no exercício anterior você alterou o getAlunos para:

public Set<Aluno> getAlunos() {
    return Collections.unmodifiableSet(alunos);
}

certo?

A proposta do exercício é mostrar como podemos (e devemos) usar o unmodifiableSet da classe Collections a fim de evitar quebras de encapsulamento.

Ou seja, a ideia é que você tente adicionar um novo aluno nesse Set de alunos e veja como , após a alteração, o encapsulamento está mais seguro =)

O exercício pede pra gente tentar adicionar outro aluno após resgatar o Set de alunos:

Set<Aluno> alunos = javaColecoes.getAlunos();

//tente adicionar mais um aluno no Set de alunos (sempre sem acentos)

Acho que ficou faltando isso no seu código, por isso a exception não rolou. Tenta adicionar algo como:

Set<Aluno> alunos = javaColecoes.getAlunos();
// aqui estamos adicionando um novo aluno no Set
alunos.add(new Aluno());

Se a exceção não for lançada significa que esse Set ainda é editável e, provavelmente, não temos a chamada do Collections.unmodifiableSet dentro do getAlunos =)

Outro detalhe, no código que você compartilhou aqui com a gente, estamos adicionando o aluno na instância de Curso:

Curso javaColecoes = new Curso("Dominando as coleções do Java", "Paulo Silveira");
...
javaColecoes.add(a4);                

Ao invés de adicionar no Set como foi pedido no exercício. Ou seja, não estamos tentando alterar o Set e por isso não rolou a exceção =)

Qualquer problema é só falar.

Abraço!

Fala André !

Cara muiiiiiito obrigado pelo esclarecimento \o/

fiz o teste aqui e funcionou e agora eu entendi qual era o objetivo do exercício !

mais uma vez muito obrigado !