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

Mais de uma lista para um mesmo objeto

Se eu tiver mais de uma lista referenciando o mesmo objeto:

Curso novoCurso = new Curso("Curso A", "Julio Gouveia");

        List<Aula> aulas = novoCurso.getAulas();

        List<Aula> aula2 = novoCurso.getAulas();

        System.out.println(novoCurso.getAulas());

        novoCurso.getAulas().add(new Aula("dominando arrays", 21));

        System.out.println(aulas);
        System.out.println(aula2);

fiz o teste e percebi que sempre que adicionar uma aula em um curso e esse curso tiver mais de uma lista, automaticamente essa aula vai parar nas duas listas.

mas não quero inserir a mesma aula para as duas lista, queria escolher para qual lista minha aula deve ir.

isso e possível ?

5 respostas

Julio pelo oque estou vendo, você criou 2 lista para o mesmo objeto Aula, e quando voce esta adicionando

 List<Aula> aulas = novoCurso.getAulas();
List<Aula> aula2 = novoCurso.getAulas();

Para inserir na list que você quer uma solução é criar um outro objto do tipo Aula, e adicionar aonde você queira

Exatamente isso, criei 2 listas para o mesmo objeto, so que eu quero escolher qual lista eu vou adicionar o elemento.

se eu chamar

novoCurso.getAulas().add(new Aula("dominando arrays", 21));

essa aulas dominando arrays com 21 min, vai ir paras as duas listas e eu queria ter a liberdade de escolher em qual colocar.

criei um método adiciona na classe Curso :

public void adiciona(List<Aula> lista, Aula aula){
        lista.add(aula);        
    }

mesmo assim esta adicionando nas duas listas kkk

chamada do método adiciona:

novoCurso.adiciona(aula2, new Aula("dominando arrays", 21));

esse método deveria adicionar um um elemento que foi passado como argumento, na lista que foi passada como argumento, concorda ?

ou eu to viajando ?

Olha fiz um exemplo aqui, ve se resolve o seu problema, fiz uma calsse Curso

import java.util.LinkedList;
import java.util.List;

public class Curso {
    private Aula aula = new Aula();
    private String nome;
    private List<Curso> cursos = new LinkedList<Curso>();
    public Curso() {

    }
    public Curso(String nome, Aula aula) {
        this.nome = nome;
        this.aula = aula;
    }
    public void adicionaCurso(String nome, Aula aula) {
        Curso curso = new Curso(nome, aula);
        cursos.add(curso);
    }
    public Aula getAula() {
        return aula;
    }

    public void setAula(Aula aula) {
        this.aula = aula;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }
    public void mostrarCurso() {
        for(Curso c: cursos) {
            System.out.println(c + "" + c.getAula());
        }
    }

    @Override
    public String toString() {
        return "Nome do curso: " + getNome();
    }
}

Depois fiz uma classe Aula

public class Aula {
    private int minuto;
    private String nome;
    public Aula() {

    }
public Aula(String nome, int minuto) {
    this.nome = nome;
    this.minuto = minuto;
}
    public int getMinuto() {
        return minuto;
    }

    public void setMinuto(int minuto) {
        this.minuto = minuto;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    @Override
    public String toString() {
        return " Nome aula: " +getNome()+ " minutos: " +getMinuto();
    }
}

Ai no meu main fiz uma o teste.

public class Testando {
    public static void main(String[] args) {

        Curso curso1 = new Curso();
        Curso curso2 = new Curso();


        curso1.adicionaCurso("Sistema De Informação", new Aula("Nome da aula", 20));
        curso2.adicionaCurso("ADS", new Aula("Outro nome de aula", 21));


        curso1.mostrarCurso();
        System.out.println("");
        curso2.mostrarCurso();
    }
}

Olá Julio, tudo bem?

Seu caso é um pouco sutil, mas vou tentar explicar o que acontece.

Quando você fez essa parte do seu código abaixo:

List<Aula> aulas = novoCurso.getAulas();
List<Aula> aula2 = novoCurso.getAulas();

Significa que tanto a lista aulas quanto a lista aula2 estão apontando para a lista de aulas do objeto novoCurso. Ao adicionar uma aula em uma das duas listas como você fez:

novoCurso.adiciona(aula2, new Aula("dominando arrays", 21));

Na verdade o que ocorreu foi que , mesmo que indiretamente, você adicionou uma aula na lista de aulas do objeto novoCurso, pois no inicio voce referenciou a lista deste objeto nas duas listas criadas.

Se você alterar o seu exemplo e adicionar na outra lista:

 novoCurso.adiciona(aulas, new Aula("dominando arrays", 21));

Vai perceber que o resultado será o mesmo, porque na realidade voce está adicionando na lista do curso e não da lista que o referencia. E como ambas estão referenciando a lista do mesmo objeto novoCurso, ao imprimir o conteúdo de ambas, sempre será igual. Acho que sua dúvida está relacionada mais sobre referência à objetos.

Para ter o efeito que você esperava, voce deveria fazer algo parecido com o seguinte:

        List<Aula> aulas = new ArrayList<Aula>();
        List<Aula> aula2 = new ArrayList<Aula>();

        aulas.addAll(novoCurso.getAulas());
        aula2.addAll(novoCurso.getAulas());

Desta forma , voce estaria preenchendo as listas com as listas do curso, e não apenas referenciando ela. Se executar agora o seu método adiciona:

novoCurso.adiciona(aulas, new Aula("dominando arrays", 21));

Verá que apenas a lista escolhida terá o novo curso adicionado, pois agora elas são listas independentes.

[Aula: dominando arrays, 21 minutos]
[]

Espero ter sido claro e tenha conseguido sanar sua dúvida.

Mais sobre o assunto pode ser visto aqui.

Abraços

solução!

Não cheguei a ler todas as respostas dadas para esta pergunta, porém, vou dar a minha resposta:

Ao instanciar um objeto, a variável atribuída a esta instância recebe uma referência a este objeto, o que isto quer dizer?

É dado um endereço dentro da memória a este objeto e a variável recebe este endereço, assim, do modo como está fazendo, você atribui o mesmo objeto a duas listas, as variáveis destas listas recebem a referência que é dada ao objeto, então, as duas variáveis tem o mesmo valor.

Espero ter ajudado com algo e que a explicação não tenha ficado confusa.