Duvido com orientação a Objetos

10 respostas
java
L

Eai galerinha blz? Então entrei na faculdade este ano e tava tranquilo até esse bimestre rs. Surigiram algumas duvidas e preciso de uma ajuda. Por exemplo criei uma classe Banco de dados para deixar salvo minhas instancias de Alunos e Materias. Como posso manipular as instancias dos objetos criados um a um fora do construtor da classe banco de dados. Quando tento puxar a instancia por exemplo do aluno1 não consigo. Obrigado desde já.

10 Respostas

L

Marque os ArrayList (ListaDeAlunos e ListaDeDisciplinas) como estático, com isso, você conseguira acessar essas listas quando quiser e os dados ficarão guardados lah enquanto a aplicação estiver rodando:

public static final List<Aluno> LISTA_ALUNOS = new ArrayList<>();
public static final List<Disciplina> LISTA_DISCIPLINAS = new ArrayList<>();

E em outra classe qualquer:

Aluno aluno = BancoDeDados.LISTA_ALUNOS.get(0);

E, para ficar melhor, você pode criar métodos utilitarios dentro da classe BancoDeDados para facilitar a manipulação das listas.

D

Esquece o que o @Lucas_Camara disse.
Crie métodos para acessar as listas (sim, os getters e setters).
Considere o uso de singleton para a classe BancoDeDados.

L

Obrigado pelas respostas, a do lucastody não foi bem o que eu procurava.
Já a do Darlan eu não conheço muito sobre o assunto mas vou procurar mais sobre.
Muito obrigado.

D
public class Foo {
    private List<String> lista;

    public void setLista(List<String> lista) {
        this.lista = lista;
    }
 
    public List<String> getLista() {
        return this.lista == null new ArrayList<String>() : lista;
   }
}

Singleton - uma única instância para toda a estrutura.
Uso: quando você precisa garantir que uma única instância está rodando, a fim de ter os mesmos dados em quaisquer ponto do sistema.

public class Foo {
    private static final Foo INSTANCE = new Foo();

    public static Foo getInstance() {
        return INSTANCE;
   }

    public void blablabla() {}
}

Se bem me lembro, é isso;
E você pode usar assim

Foo foo = Foo.getInstance();
foo.blablabla();
V

ListaDeAlunnos.get(0) lhe retorna o aluno1, pois nessa situação você sabe que o aluno1 foi o primeiro a ser inserido.

Mas na maior parte das vezes o que ocorre é que você vai estar procurando não o primeiro registro inserido, e sim o registro cujo o nome seja “João” por exemplo, ai você deve percorrer a lista para encontrar quem é o aluno dentro da lista que tem nome de “João”.

L

Então galera obrigado pelas dicas, pesquisei sobre esse Singleton, mas acredito que não seja bem o que eu estou precisando, pelo que eu vi Singleton é “para ter certeza que há apenas uma instância de uma determinada classe em nosso sistema, classes de configuração, janelas únicas e classes com atributos únicos.”

O meu problema não é ter várias instancias, mas sim em não conseguir extrair do ArrayList o objeto que coloquei lá.
Por exemplo eu fiz a instancia dos objetos (alunos) no construtor da classe Banco, tudo certo por ai. Mas quando tento utilizar um método dentro da classe Banco que necessite de um parâmetro que seja o nome do objeto (aluno1 ou aluno2) para constar se ele esta contido no ArrayList da erro. Ou até mesmo tentar puxar a instancia do objeto aluno fora da classe Banco.

public BancoDeDados(){

    Aluno aluno1 = new Aluno("Lucas", 1);
    Aluno aluno2 = new Aluno("João", 2);
    Aluno aluno3 = new Aluno("Tales", 3);
    Aluno aluno4 = new Aluno("Isabella", 4);
    Aluno aluno5 = new Aluno("Leandro", 5);
    Aluno aluno6 = new Aluno("Maria", 6);
    Aluno aluno7 = new Aluno("Maria", 6);

    ListaDeAlunos.add(aluno1);
    ListaDeAlunos.add(aluno2);
    ListaDeAlunos.add(aluno3);
    ListaDeAlunos.add(aluno4);
    ListaDeAlunos.add(aluno5);
    ListaDeAlunos.add(aluno6);

}


    public void getAlunoBanco(Aluno aluno){
    System.out.println(ListaDeAlunos.contains(aluno));
}
D

Recomendo que as buscas sejam pelos atributos:

public List<Aluno> buscarAlunosPorNome(String nome) { ... }
public Aluno buscarAlunoPorCPF(String cpf) { ... }
M

O método contains vai retornar true ou false dependendo se o objeto esta ou não na lista, pra isso você tem que sobrescrever os métodos equals e hashcode.

Sobrescrevendo esses métodos você diz ao java o que são objetos diferentes, pode ser que objetos diferentes sejam objetos que tenham o nome diferente ou então a altura, preço,etc.

Se estiver usando o eclipse: botao direito -> source -> generate equals and hashcode -> escolhe qual o atributo que vai dizer que o objeto é unico (normalmente id/codigo)

Para buscar um aluno pelo nome pode ser feito assim:

public void exibirAlunoPeloNome(String nome){
    for(Aluno a: ListaDeAlunos)
    {
        if(a.getNome().equals(nome))
        {
            System.out.prinln(a.getNome() + ", " + a.getEscolaridade());
        } 
    }
}
S

Um exemplo tornando a classe BancoDados um singleton como o @darlan_machado havia sugerido.

import java.util.ArrayList;
import java.util.List;

public class BancoDados {

    private static final BancoDados instancia = new BancoDados();

    public static BancoDados get() {
        return instancia;
    };

    private final List<Aluno> alunos = new ArrayList<>();

    private BancoDados() {
        alunos.add(new Aluno("Lucas", 1));
        alunos.add(new Aluno("João", 2));
        alunos.add(new Aluno("Tales", 3));
        alunos.add(new Aluno("Isabella", 4));
        alunos.add(new Aluno("Leandro", 5));
        alunos.add(new Aluno("Maria", 6));
    }

    public Aluno buscarPorNome(String nome) {
        for (Aluno aluno : alunos) {
            if (nome.equalsIgnoreCase(aluno.getNome())) {
                return aluno;
            }
        }
        return null;
    }
}

Exemplo de uso:

public class Exemplo {

    public static void main(String[] args) {
        Exemplo programa = new Exemplo();
        programa.executar();
    }

    private void executar() {
        pesquisar("Ricardo");
        pesquisar("Lucas");
    }

    private void pesquisar(String nome) {
        BancoDados banco = BancoDados.get();
        Aluno aluno = banco.buscarPorNome(nome);
        if (aluno == null) {
            System.out.printf("Aluno %s não encontrado!%n", nome);
            return;
        }
        System.out.printf("A nota do aluno %s é %d%n", aluno.getNome(), aluno.getNota());
    }
}
L

Muito obrigado pela ajuda galera, desculpem a noobada, consegui implementar o singleton com as dicas e auxilio de vocês, agora vou estudar mais sobre o assunto para não ter mais problemas. Obrigado de verdade!!

Criado 6 de junho de 2018
Ultima resposta 8 de jun. de 2018
Respostas 10
Participantes 7