Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

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 !