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á.
Duvido com orientação a Objetos
10 Respostas
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.
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.
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.
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();
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”.
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));
}
Recomendo que as buscas sejam pelos atributos:
public List<Aluno> buscarAlunosPorNome(String nome) { ... }
public Aluno buscarAlunoPorCPF(String cpf) { ... }
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());
}
}
}
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());
}
}
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!!
