Instancia Dinamica

Olá pessoas. Gostaria de saber se tem e como seria fazer uma instância feita pelo usuário.

Tive essa idéia quando fazia um exercício da faculdade e não sei se seria possível, mas estou fazendo assim:

Criando um loop com do-While onde o loop finaliza apenas quando digitado 7. A primeira opção é criar uma instancia da Classe ContaBancaria onde será inserido o nome do cliente e seu saldo.

Particulamente eu não gosto de criar um tamanho fixo de clientes ou algo similar e fiquei com isso na cabeça, mas sem saber se é possível.

Ai meu código para entenderem melhor o que desejo dizer:

[code]public class Principal {

public static void main(String[] args){

    int selectMenu;
    String nc;
    float sl;

    Scanner scan = new Scanner(System.in);

    do{
    System.out.println("Cod |       Função.        ");
    System.out.println("---------------------------");
    System.out.println(" 1  | Inserir novo Cliente.");
    System.out.println(" 2  | Listar Cliente.      ");
    System.out.println(" 3  | Debitar Conta.       ");
    System.out.println(" 4  | Creditar Conta.      ");
    System.out.println(" 5  | Atribuir novo Saldo. ");
    System.out.println(" 6  | Alterar nome cliente.");
    System.out.println(" 7  | Finalizar Sistema.   ");

    System.out.print("Insira o valor da opção desejada:");
    selectMenu = scan.nextInt();

    switch(selectMenu){

        case 1:
            ContaBancaria x = new ContaBancaria();
            break;
        case 2:
            break;
        case 3:
            break;
        case 4:
            break;
        case 5:
            break;
        case 6:
            break;
        case 7:
            System.out.println("O Software será finalizado!");
            break;
        default:
            System.out.println("Valor inserido não corresponde a algum proposto.");
            break;            
    }

    }while(selectMenu != 7);
}

}[/code]

Depende; nao entendi muito sua pergunta; mas você pode instanciar uma list; para guardar suas contas; ou um map; para associar um cliente a uma conta.

Falae amigo blz??

programação dinamica em Java é utilizado atraves de Reflexão (Java Reflection API)

Mas acho que não é isso que vc precisa não.

O que voce quer, é que quando um usuario digite alguma opcao e atraves dessa opcao algum objeto seja instanciado? Se sim… isso é uma instanciação comum… que no seu caso, daria atraves de uma condição (opção que o usuario digitou). Como vc fez no trecho abaixo:

case 1:   
                ContaBancaria x = new ContaBancaria();   
                break;   

Explique melhor… abracos

Bom galera, tipo assim. Quando se vai criar um cliente, por exemplo, tem que fazer uma instancia para cada cliente. Minha dúvida é fazer essas instâncias sem um número determinado e sem precisar fazer na código. Tipo, o programa já como um executável e quando é iniciado se pode fazer diversas instancias sem mexer no código fonte, apenas no console ou interface gráfica do programa.

O que desejo é instanciar quantas vezes for preciso sem que se mexa no código fonte e os atributos de cada Instância tem que ser diferente. Pensei que quando fosse cadastrar um novo cliente o usuário iria digitar uma String que seria o atributo da instancia exemplo:

Inserir novo cliente: Linus

Ai no código ele iria pegar o nome Linus e iria fazer a instancia:

ContaBancaria linus = new ContaBancaria();

Olá!

Amigão, acho que você deve estar fazendo confusão.

Deixa eu explicar uma coisa, pode ser que você já saiba mas, se souber, será só uma revisão.

:wink:

Quando se faz:

ContaBancaria joao = new ContaBancaria();

ContaBancaria joao -> significa que você está criando uma váriavel de referência do tipo ContaBancaria, e essa variavel sera acessivel pela palavra chave joao.
new ContaBancaria() -> significa que você está criando uma instancia do tipo ContaBancaria.
= ->indica que você está usando a váriável da esquerda para apontar para a instancia da direita.

Logo joao não tem uma relação forte com o objeto instaciado, tanto que você pode apontar a variavel joao para outro objeto.

Se você quer que as instancias do tipo ContaBancaria possuam um nome, isso deve ser feito criando um atributo de instancia na declaração da classe:

class ContaBancaria {
	
	private String nome;
	
	public ContaBancaria() {
	}

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

Olha só isso:

ContaBancaria joao = new ContaBancaria();
ContaBancaria maria = new ContaBancaria();
System.out.println("joao = " + joao);
System.out.println("maria = " + maria);
ContaBancaria temp = joao; //a instancia referenciada por joao passa a ser referenciada tambem por temp.
joao = maria; // joao passa a referenciar a mesma instancia que maria
maria = temp; // maria passa a referenciar a instancia que era referenciada por joao na primeira linha
System.out.println("joao = " + joao);
System.out.println("maria = " + maria);

No código acima, usando uma variável a mais eu consegui fazer com que joao e maria trocassem suas referencias.
Se você executar vai ver que os valores são trocados entre as variaveis.

desculpe se chovi no molhado.
mas espero que tenha ajudado.

[]'s

ahhhhhhhhhhhhh entendi…rsrsrsr

cara nao eh pq o seu objeto chama x que ele sempre sera o mesmo objeto…

cada vez que o codigo

ContaCorrente x = new ContaCorrente()

for executado ele gera um objeto diferente…sera uma instancia diferente…

exemplo: ContaCorrente tera um numero certo? E de acordo com o negocio da conta o numero nunca podera ser igual… entao para cada conta corrente que voce abrir cada uma tera um numero diferente… e entao vc consegue diferenciar uma conta da outra… Mas mesmo que vc instanciasse 10 vezes o objeto X e todos com os mesmos valores nos atributos mesmo assim ainda seriam 10 objetos diferentes…pq na memoria a JVM cria um endereco d memoria para cada objeto e cada um tem um nome na memoria…isso quem gerencia eh a JVM…

o problema que ao criar o segundo objeto x vc perde a referencia do primeiro… afinal todos chamam x… para isso ou vc cria uma lista e vai armazenando suas conta correntes na lista ou salva seu objeto no banco de dados com id, numero da conta, essas coisas.e qdo precisa vc recupera de acordo com id, numero da conta…

conseguiu entender melhor cara…?

fallow

1 curtida

Bem galera, obrigado pela ajuda, mas não estou conseguindo fazer o que quero. Talvez para o que eu quero a melhor opção seja usar um DB mesmo, contudo nem sei mexer em um e não foi isso que o professor pediu. Terei que me contentar com um número determinado de clientes mesmo. O Java não tá aceitando Instancia dentro de um Switch.

Bem, deixarei meu código aqui caso alguém queria continuar minha teimosia:

Classe Main:

import java.util.Scanner;

public class Principal {

    public static void main(String[] args) {

        int selectMenu;
        
        Scanner scan = new Scanner(System.in);
        ContaBancaria cta1 = new ContaBancaria();
        ContaBancaria cta2 = new ContaBancaria();   

        do {
            System.out.println("Cod |       Função.        ");
            System.out.println("---------------------------");
            System.out.println(" 1  | Inserir novo Cliente.");
            System.out.println(" 2  | Listar Cliente.      ");
            System.out.println(" 3  | Debitar Conta.       ");
            System.out.println(" 4  | Creditar Conta.      ");
            System.out.println(" 5  | Atribuir novo Saldo. ");
            System.out.println(" 6  | Alterar nome cliente.");
            System.out.println(" 7  | Finalizar Sistema.   ");

            System.out.print("Insira o valor da opção desejada:");
            selectMenu = scan.nextInt();

            switch (selectMenu) {

                case 1:
                    System.out.print("Nome do Primeiro cliente: ");
                    cta1.nomeCliente = scan.next();
                    System.out.print("Saldo do Primeiro cliente: ");
                    cta1.saldo = scan.nextFloat();
                    System.out.println();
                    System.out.print("Nome do segundo cliente: ");
                    cta2.nomeCliente = scan.next();
                    System.out.print("Saldo do segundo cliente: ");
                    cta2.saldo = scan.nextFloat();
                    break;
                case 2:
                    System.out.println("----------------------------");
                    System.out.println("Cliente: " + cta1.nomeCliente);
                    System.out.println("Saldo: " + cta1.saldo);
                    System.out.println();
                    System.out.println("Cliente: " + cta2.nomeCliente);
                    System.out.println("Saldo: " + cta2.saldo);
                    System.out.println("----------------------------");
                    break;
                case 3:
                    System.out.println("Deseja debitar de qual cliente: ");
                    System.out.println("1 para " + cta1.nomeCliente);
                    System.out.println("2 para " + cta2.nomeCliente);
                    System.out.println("Insira o cod:");
                    int clSelect = scan.nextInt();

                    System.out.print("Insira o valor do débito de ");
                    switch (clSelect) {
                        case 1:
                            System.out.print(cta1.nomeCliente + ": ");
                            float vlr = scan.nextFloat();
                            cta1.debitar(vlr);
                            System.out.println("Débito Realizado com sucesso!");
                            break;
                        case 2:
                            System.out.println(cta2.nomeCliente + ": ");
                            vlr = scan.nextFloat();
                            cta2.debitar(vlr);
                            System.out.println("Débito Realizado com sucesso!");
                            break;
                        default:
                            System.out.println("Valor não válido!");
                            break;
                    }
                    break;
                case 4:
                    System.out.println("Deseja creditar em qual cliente: ");
                    System.out.println("1 para " + cta1.nomeCliente);
                    System.out.println("2 para " + cta2.nomeCliente);
                    System.out.println("Insira o cod:");
                    clSelect = scan.nextInt();

                    System.out.print("Insira o valor do crédito: ");
                    switch (clSelect) {
                        case 1:
                            System.out.println(cta1.nomeCliente + ": ");
                            float vlr = scan.nextFloat();
                            cta1.creditar(vlr);
                            System.out.println("Crédito Realizado com sucesso!");
                            break;
                        case 2:
                            System.out.println(cta2.nomeCliente + ": ");
                            vlr = scan.nextFloat();
                            cta2.creditar(vlr);
                            System.out.println("Crédito Realizado com sucesso!");
                            break;
                        default:
                            System.out.println("Valor não válido!");
                            break;
                    }
                    break;
                case 5:
                    System.out.println("Deseja atribuir um novo saldo a ");
                    System.out.println("1 para " + cta1.nomeCliente);
                    System.out.println("2 para " + cta2.nomeCliente);
                    System.out.print("Insira o código: ");
                    clSelect = scan.nextInt();

                    switch (clSelect) {
                        case 1:
                            System.out.println("Novo saldo de "+cta1.nomeCliente+" é: ");
                            float novoSaldo = scan.nextFloat();
                            cta1.trocarSaldo(novoSaldo);
                            break;
                        case 2:
                            System.out.println("Novo saldo de "+cta2.nomeCliente+" é: ");
                            novoSaldo = scan.nextFloat();
                            cta2.trocarSaldo(novoSaldo);
                            break;
                        default:
                            System.out.println("Valor inserido Invalido!");
                            break;
                    }

                    break;
                case 6:
                    System.out.println("Deseja atribuir um novo nome a ");
                    System.out.println("1 para " + cta1.nomeCliente);
                    System.out.println("2 para " + cta2.nomeCliente);
                    System.out.print("Insira o código: ");
                    clSelect = scan.nextInt();

                    switch (clSelect) {
                        case 1:
                            System.out.println("Insira o novo nome: ");
                            String novoNome = scan.next();
                            cta1.trocarNome(novoNome);
                            break;
                        case 2:
                            System.out.println("Insira o novo nome: ");
                            novoNome = scan.next();
                            cta2.trocarNome(novoNome);
                            break;
                        default:
                            System.out.println("Valor inserido Invalido!");
                            break;
                    }
                case 7:
                    System.out.println("Sistema será finalizado.");
                    break;
                default:
                    System.out.println("Valor inserido não corresponde a algum proposto.");
                    break;
            }

        } while (selectMenu != 7);
    }
}

Classe ContaBancaria:


package p1;
public class ContaBancaria {

    String nomeCliente;
    float saldo;

    public ContaBancaria(){
        nomeCliente = "";
        saldo = 0;
    }

    public ContaBancaria(String nomeCliente, float saldo){
        this.nomeCliente = nomeCliente;
        this.saldo = saldo;
    }

    public void debitar(float vlr){
        if(vlr<saldo){
        saldo = saldo - vlr;
        System.out.println("Novo saldo é: "+saldo);
        }else{
            System.out.println("Debito maior que saldo. Ação cancelada.");
        }
    }

    public void creditar(float vlr){
        saldo = saldo + vlr;
    }

    public void trocarNome(String novoNomeCliente){
        nomeCliente = novoNomeCliente;
    }

    public void trocarSaldo(float novoSaldo){
        saldo = novoSaldo;
    }

}

Caso você queira inserir mais de dois clientes você poderia criar um HashMap<String, ContaBancaria>, aí na key vc guardaria o nome do cliente, e no value a ContaBancaria em si. Aí vc localizaria o objeto da conta pelo nome do cara.

^^

[]'s

Então com esse HashMap eu poderia fazer assim:

String nomeCliente = scan.next(); // receber do usuário o nome do cliente

HashMap<nomeCliente, ContaBancaria>

Com isso o nome que o usuário digitar será a referencia a Instancia, tipo, se o usuário digitar Pedro, será o mesmo que ter digitado ContaBancaria pedro = new ContaBancaria(); ?