Crud em Java(Dúvida)

Boa Tarde,

Minha dúvida sobre fazer um CRUD, se possível faze-lo apenas com ArrayList, sem MySQL.

Comecei o meu CRUD mas estou com dificuldades de criar um novo Cliente, pois toda vez que crio um segundo Cliente, ele sobrepoem o Cliente anterior.

Toda vez que eu for cadastrar um novo Cliente, terei que fazer uma nova referência? Assim resolvendo esse problema, mas como são vários Clientes que o usuário poderá cadastrar, quero saber se tem como fazer de outro jeito sem ser esse :

image

->“mas como assim , sem ser esse?” ( Porque como vou criar 3 referências se o usuário quis criar apenas 3)

Agradeço deis de já pelo seu tempo.

Então não é CRUD. E tu vai armazenar em um array? E não precisa ter persistência? Ou seja, desligou a máquina ou fechou o programa as informações irão se perder?
Contudo…

Cliente cliente1 = new Cliente();
cliente.setPessoa(pessoa1);

Cliente cliente2 = new Cliente();
cliente.setPessoa(pessoa2);

Cliente cliente3 = new Cliente();
cliente.setPessoa(pessoa);

Seria melhor se postasse como estão as classes Pessoa e Cliente.

public static void main(String[]args){
Scanner teclado = new Scanner(System.in);
List clientos = new ArrayList<>();
Pedido pedido = new Pedido();
int Escolha;

    do{
      System.out.println("  Pedidos  de Clientes ");
      
      System.out.println(" 1 - Cadastar Cliente");
     
      System.out.print("Opcao: ");
      Escolha = teclado.nextInt();
      switch(Escolha){
          case 1:
              pedido.inserirCliente(pedido.Cliente);
              break;

Classe Pedido:

public class Pedido {
Scanner teclado = new Scanner(System.in);
Cliente Cliente = new Cliente();
ItemPedido item = new ItemPedido();
List listclientes;
List lispedido;
Cliente atualizar;
private int opcao;
private String nome;

public void inserirCliente(Cliente c){

        System.out.println("Seu ID - "+indice);
        c.setClienteID(indice);
        System.out.println("Qual o seu nome: ");
        c.setNome(teclado.next());
        System.out.println("Qual o seu Email: ");
        c.setEmail(teclado.next());
        indice++;
        listclientes.add(c);

Classe Cliente

Com metodos get e set apenas .

Tem de alguma forma , fazer esse procedimento da foto acima sem necessariamente fazer isso:
image

e sim é um cadastro simples , talvez nem crud é , mas apenas com arraylist(desligou acabou, coisa de iniciante).

O problema é transforma isso :
image

em apenas uma chamada de Método :

public void inserirCliente(Cliente c){

        System.out.println("Seu ID - "+indice);
        c.setClienteID(indice);
        System.out.println("Qual o seu nome: ");
        c.setNome(teclado.next());
        System.out.println("Qual o seu Email: ");
        c.setEmail(teclado.next());
        indice++;
        listclientes.add(c);

}

mas sem sobrepor os dados dos clientes anteriores.

Um exemplo…

Diagrama de classes:

image

1 - Pessoa:

public abstract class Pessoa {
	private int id;
	private String nome;
	private String apelido;
	private int idade;
	
	/*
	* Métodos acessores e modificadores
	*/
	public void setId(int id){
		this.id = id;
	}
	
	public int getId(){
		return id;
	}
	
	public void setNome(String nome){
		this.nome = nome;
	}
	
	public String getNome(){
		return nome;
	}
	
	public void setApelido(String apelido){
		this.apelido = apelido;
	}
	
	public String getApelido(){
		return apelido;
	}
	
	public void setIdade(int idade){
		this.idade = idade;
	}
	
	public int getIdade(){
		return idade;
	}
}

2 - Cliente:

public class Cliente extends Pessoa {
	private String documento;
	
	/*
	* Métodos acessores e modificadores
	*/
	public void setDocumento(String doc){
		this.documento = doc;
	}
	
	public String getDocumento(){
		return documento;
	}
}

3 - Principal:

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

public class Principal {
	private int id;
	private String nome;
	private String apelido;
	private int idade;
	private String documento;
	private List<Cliente> clientela = new ArrayList<>(); 
	
	public void lerDados(){
		Scanner leitor = new Scanner(System.in);
		
		System.out.print("ID: ");
		id = leitor.nextInt();
		
		
		System.out.print("Nome: ");
		nome = leitor.nextLine();
		
		//Limpar o scanner
		leitor.nextLine();
		
		System.out.print("Apelido: ");
		apelido = leitor.nextLine();
		
		System.out.print("Idade: ");
		idade = leitor.nextInt();
		
		//Limpar o scanner
		leitor.nextLine();
		
		System.out.print("Documento: ");
		documento = leitor.nextLine();
	}
	
	public Cliente retornarCliente(){
		Cliente cliente = new Cliente();
		
		cliente.setId(id);
		cliente.setNome(nome);
		cliente.setApelido(apelido);
		cliente.setIdade(idade);
		cliente.setDocumento(documento);
		
		return cliente;
	}
	
	public void salvarCliente(Cliente cliente){
		if(cliente != null){
			clientela.add(cliente);
			
		}else{
			System.out.println("Ocorreu um erro. Impossível salvar o cliente!");
		}
	}
	
	public void listarClientes(){
		System.out.println("\n\n");
		for(Cliente cliente : clientela){
			System.out.println("Id: " + cliente.getId());
			System.out.println("Nome: " + cliente.getNome());
			System.out.println("Apelido: " + cliente.getApelido());
			System.out.println("Idade: " + cliente.getIdade());
			System.out.println("Documento: " + cliente.getDocumento() + "\n\n");
			
		}
	}
	
	public void alterarCliente(Cliente cliente){
		if(cliente != null){
			for(int i = 0; i < clientela.size(); i++){
				if(clientela.get(i).getId() == cliente.getId())
					clientela.set(i, cliente);
			}
		}
	}
	
	public void excluirCliente(Cliente cliente){
		if(cliente != null){
			for(int i = 0; i < clientela.size(); i++){
				if(clientela.get(i).getId() == cliente.getId())
					clientela.remove(cliente);
			}
		}
	}
	
	public static void main(String[] args){
		Principal principal = new Principal();
		Scanner leitor = new Scanner(System.in);
		boolean sair = false;
		
		do{
			System.out.println("\n\tMenu");
			System.out.println(
				"1 - Abrir novo cadastro\n" +
				"2 - Salvar cadastro\n" +
				"3 - Atualizar cadastro\n" +
				"4 - Excluir cadastro\n" +
				"5 - Lista clientes\n" +
				"6 - Sair\n"
			);
			
			System.out.print("\tOpção escolhida: ");
			int opcao = leitor.nextInt();
			System.out.println("\n\n");
			
			
			switch(opcao){
				case 1:
					principal.lerDados();
					break;
				case 2:
					principal.salvarCliente(principal.retornarCliente());
					break;
				case 3:
					principal.lerDados();
					principal.alterarCliente(principal.retornarCliente());
					break;
				case 4:
					principal.lerDados();
					principal.excluirCliente(principal.retornarCliente());
					break;
				case 5:
					principal.listarClientes();
					break;
				case 6:
					sair = true;
					break;
				default: System.out.println("\nOpção inválida!\n");
			}
			
		}while(sair == false);
		leitor.close();
	}
}

Rodando…

Jothar você é um gênio irmão!! Amigo só faltou “matar o mal pela raiz”,

o meu problema e na saída dos dados(que faltou na imagem saída que você mandou), eu usando sua saída como exemplo iria em Salvar cadastro, mas (no meu) ele sempre sobrepoem o cadastro anterior, que na suas imagens eu não pude ver se daria também. Consegue confirmar para mim ? Creio eu que o seu também sobrepoem os dados do cadastro anterior.

Quero eu uma lista(de mais de um cadastro, no mesmo estilo que você me mostrou na imagem)

Aguardo…

Se você reparar, o método lerDados() guarda cada uma das informações em variáveis globais correspondentes. Se são globais, qualquer método pode operar com elas. Quando eu chamo o salvarCliente(Cliente cliente), esse método recebe o método o retorno do método retornarCliente() que instancia um novo objeto cliente e coloca as informações das variáveis globais no atributos. Logo, toda vez que selecionar a opção 2 (salvar) instanciará um novo objeto cliente e então serão objetos diferentes. Logo, não haverá sobreposição.
No caso eu fiz separado, mas você pode salvar logo depois de ler. No meu código, se o cara esquecer de selecionar a opção 2 depois de ler os dados de um cliente, esse cliente será perdido (não será adicionado à lista).

1 curtida

M E U D E U S ! TESTADO !!! OBG Jothar você salvou meu Dia! Deus te Abençoe :DDDDDDDDDDDDDDDDDD

Havia um problema com o método lerDados() Não estava ‘lendo’ o nome e sim lixo do buffer. A correção:

public void lerDados(){
	Scanner leitor = new Scanner(System.in);
	
	System.out.print("ID: ");
	id = leitor.nextInt();
	
	
	System.out.print("Nome: ");
	//Limpar o scanner
	leitor.nextLine();
	nome = leitor.nextLine();
	
	System.out.print("Apelido: ");
	apelido = leitor.nextLine();
	
	System.out.print("Idade: ");
	idade = leitor.nextInt();
	
	System.out.print("Documento: ");
	//Limpar o scanner
	leitor.nextLine();
	documento = leitor.nextLine();
}

image

Desse jeito eu queria , mas o problema que ele sempre sobrepoem os dados do Cliente Anterior.