Variavel statica

15 respostas
M

boa tarde

preciso fazer um trabalho da faculdade e me surgiu uma duvida

eu tenho que criar uma agenda aonde cadastro 1 pessoa para n telefones…

devo usar isso em memoria, usando coleções e gravacao de arquivo txt

e ai me veio uma duvida, vi no livro do deitel sobre uma utilidade de variavel static que poderia eu usar como codigo do campo incrementado no construtor da classe

eu criei 2 classes

contato

telefone

cada uma delas eu no construtor crio os campos cod++

mas ai vem a duvida…

se eu add um novo contato a classe telefone inicia a contagem desde o 1 novamente?

public class Contato {

	private static int cod;
	private String nome;
	private String cidade;
	private Telefone telefone;
	private String email;
	
	public Contato(){
		cod++;
	}
public class Telefone {

	private static int cod_telefone;
	private String num_telefone;

	public Telefone() {
		cod_telefone++;
	}

abaixo destes codigos tem metodos setter e getters…

e ai…como fica a questao do codigo

vlw!

15 Respostas

nel

Oi.

Sim, funciona, mas tu precisa iniciar a variável com algum valor, 0, por exemplo.
Podes explicar porque queres fazer dessa forma ? Não estou gostando muito…(não que eu tenha de gostar de algo, obviamente)

M

nel:
Oi.

Sim, funciona, mas tu precisa iniciar a variável com algum valor, 0, por exemplo.
Podes explicar porque queres fazer dessa forma ? Não estou gostando muito…(não que eu tenha de gostar de algo, obviamente)

Sem desfazer mas eu pensei em incializar com zero a variavel codigo…

Olha pensei neste modo pq seria algo q pensei mas se quise sugerir algo pra mim esteja livre…

So preciso fazer assim como o exemplo do professor

Sequencial:1
Nome:NOME_DO_CONTATO
Cidade:CIDADE_DO_CONTATO
Fones:1=FONE_DO_CONTATO — 2=FONE_DO_CONTATO — 3=FONE_DO_CONTATO
Email:EMAIL_DO_CONTATO

Sequencial:2
Nome:NOME_DO_CONTATO
Cidade:CIDADE_DO_CONTATO
Fones:1=FONE_DO_CONTATO
Email:EMAIL_DO_CONTATO

Aonde o numero de telefones varia por pessoa…

nel

Entendo.

Provavelmente ele quis sugerir algo como se fosse uma chave primária em um banco de dados.
Tranquilo, se tu não controlar isso no construtor terá de ser em outro momento, mas o construtor garante isso para você sem maiores dores de cabeça.

Deixando privado e estático vai funcionar sem problemas.

lucaslzl

Você tem que inicializar a variável. Uma variável “Static” é a mesma para todos os objetos criados dessa classe que tem a variável, todos os valores dessa variável tem o mesmo valor em todos os objetos, e se modificar em um dos objetos será modificado em todos.

nel

Que ? Do que é que tu está falando ? :slight_smile:
Só vou falar algo, modificar estático indica que pertence a classe e não a referência !

rmello

Nel, pelo que entendi o lucaslzl quis dizer exatamente isso.

Acho que a preocupação do lucaslzl é que se nosso amigo acessar Contato.cod em qualquer contato será impresso o mesmo código. para todas as instâncias.

nosso amigo teria que criar uma outra variável para guardar o código do contato. exemplo:

public class Contato {   
  
    private static int cod;
    private int codDoContato;   
    private String nome;   
    private String cidade;   
    private Telefone telefone;   
    private String email;   
       
    public Contato(){   
        cod++;   
        codDoContato = cod;
    }

O mesmo teria que ser feito para a classe Telefone.

é isso lucaslzl ?

nel
rmello:
Nel, pelo que entendi o lucaslzl quis dizer exatamente isso.

Acho que a preocupação do lucaslzl é que se nosso amigo acessar Contato.cod em qualquer contato será impresso o mesmo código. para todas as instâncias.

nosso amigo teria que criar uma outra variável para guardar o código do contato. exemplo:

public class Contato {   
  
    private static int cod;
    private int codDoContato;   
    private String nome;   
    private String cidade;   
    private Telefone telefone;   
    private String email;   
       
    public Contato(){   
        cod++;   
        codDoContato = cod;
    }

O mesmo teria que ser feito para a classe Telefone.

é isso lucaslzl ?

Isso eu concordo contigo, pois ele não sabe qual o ID de um determinado objeto. Isso só serve como um contador, perfeito. E isso Contato.cod ele não pode fazer porque declarou cod como privado. Se ele quiser usar com uma chave primária, tem que seguir o seu conselho mesmo.

M

pera ai q fiquei um pouco confuso

entao quando eu criar um objeto contato 1 ele vai ter referencias a um objeto telefone 1

e quando eu criar um objeto contato 2 ele vai ter referencia a um objeto telefone 2

pq eu preciso ter uma contagem

como no exemplo

do numero do contato e numero de telefones do contato…

vlw

nel

macario1983:
pera ai q fiquei um pouco confuso

entao quando eu criar um objeto contato 1 ele vai ter referencias a um objeto telefone 1

e quando eu criar um objeto contato 2 ele vai ter referencia a um objeto telefone 2

pq eu preciso ter uma contagem

como no exemplo

do numero do contato e numero de telefones do contato…

vlw

A variável estática no construtor do Contato vai servir para que não repita o número, mas você deve seguir as instruções do rmello, pois precisa de uma variável que será a de instância. Sobre a quantidade de telefones, use um List, pois para cada contato tu terá uma lista de telefones. Se não quer usar list e apenas contar, cria uma variável com o getter e setter da vida para armazenar a quantidade de telefone, pois a cada vez que tu adicionar um telefone, tu incrementa ela.

rmello

Realmente ele não vai conseguir acessar diretamente a variavel cod.

Macario, para fazer a sequencia de número para cada instância de Contato e Telefone adicione uma variavel para armazenar o código da instância (variavel que não é estatica conforme passei no exemplo.

abs.

M

Irei realizar o teste pois minha duvida era essa…

Sobre o incremento relacionado…

Porque seria um relacao 1 : N de 1 contato pode ter N telefones…

Irei adicionar no meu codigo esse getCodigo…

Valeu

M

Pessoal infelizmente nao deu tao certo quanto o esperado

Segue as classes criadas, que sao 3

package modelo;

public class Telefone {

	private static int cod = 0;
	private String num_Telefone;

	public Telefone() {

	}

	public int getCod() {
		return cod;
	}

	public String getNum_Telefone() {
		return num_Telefone;
	}

	public void setNum_Telefone(String num_Telefone) {
		this.num_Telefone = num_Telefone;
	}

}
package persistencia;

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

import modelo.Telefone;

public class ListTelefone {

	private List<Telefone> listTelefone;

	public ListTelefone() {
		listTelefone = new ArrayList<Telefone>();
	}

	public void LimparTelefone() {
		this.listTelefone.clear();
	}

	public void AdcionarTelefone(Telefone t) {
		listTelefone.add(t);
	}

}
package visao;

import java.util.Scanner;

import controle.ExcessaoCampoEmBranco;

import modelo.Telefone;
import persistencia.ListTelefone;

public class NovoTelefone {

	public ListTelefone AddTelefone() throws ExcessaoCampoEmBranco {

		Scanner input = new Scanner(System.in);
		ListTelefone listaTel = new ListTelefone();
		Telefone tel = new Telefone();

		System.out.println("Digite 1 para adicionar um telefone ao contato");
		System.out.println("Digite 0 para sair");
		System.out.print("Digite a opcao: ");
		int op = input.nextInt();

		while (op != 0) {


			int cod = tel.getCod();

			try {

				System.out.printf("Digite o telefone %d do contato: ", cod);
				String t = input.next();

				if (t.isEmpty()) {
					throw new ExcessaoCampoEmBranco();
				}

				tel.setNum_Telefone(t);
			} catch (ExcessaoCampoEmBranco e) {
				e.getMessage("Telefone");
				e.printStackTrace();
			}

			listaTel.AdcionarTelefone(tel);
			System.out.println("Telefone adicionado");

			System.out.println("Deseja adicionar outro telefone?");
			System.out.println("Digite 1 para adicionar um telefone ao contato");
			System.out.println("Digite 0 para sair");
			System.out.print("Digite a opcao: ");
			op = input.nextInt();

		}

		return listaTel;
	}

}

Na primeira classe criei a entidade telefone

Na segunda classe criei a listatelefone

Na terceira eu associo 2 outras classes que não citei neste post e ai cadastro o contato com o telefone

Ai que não to sabendo direito…
Sobre como fazer com q ao adicionar a CADA novo contato conta o numero de telefones a partir do um

Entendem?

M

Resolvi de um outro modo!

package modelo;

public class Telefone {

	private int cod;
	private String num_Telefone;

	public void setCod(int cod) {
		this.cod = cod;
	}

	public String getNum_Telefone() {
		return num_Telefone;
	}

	public void setNum_Telefone(String num_Telefone) {
		this.num_Telefone = num_Telefone;
	}

}
package visao;

import java.util.Scanner;

import controle.ExcessaoCampoEmBranco;

import modelo.Telefone;
import persistencia.ListTelefone;

public class NovoTelefone {

	private int cod;

	public ListTelefone AddTelefone() throws ExcessaoCampoEmBranco {

		Scanner input = new Scanner(System.in);
		ListTelefone listaTel = new ListTelefone();
		Telefone tel = new Telefone();

		System.out.println("Digite 1 para adicionar um telefone ao contato");
		System.out.println("Digite 0 para sair");
		System.out.print("Digite a opcao: ");
		int op = input.nextInt();
				
		while (op != 0) {

			
			tel.setCod(++cod);

			try {

				System.out.printf("Digite o telefone %d do contato: ", cod);
				String t = input.next();

				if (t.isEmpty()) {
					throw new ExcessaoCampoEmBranco();
				}

				tel.setNum_Telefone(t);
			} catch (ExcessaoCampoEmBranco e) {
				e.getMessage("Telefone");
				e.printStackTrace();
			}

			listaTel.AdcionarTelefone(tel);
			System.out.println("Telefone adicionado");

			System.out.println("Deseja adicionar outro telefone?");
			System.out.println("Digite 1 para adicionar um telefone ao contato");
			System.out.println("Digite 0 para sair");
			System.out.print("Digite a opcao: ");
			op = input.nextInt();

		}
		return listaTel;
	}
}

Assim faço o controle de variável de código dentro da classe que interage com o usuário para adicionar novos telefones e quando termina sai da classe e começa tudo de novo…

vlw

Se alguem tiver uma sugestão melhor…pode dar…

Obrigado

rmello

Voce não esta gerando a numeração seguencial, voce tem que colocar a variavel do obj que vai guardar o código de cada instancia
e aribuir o valor no construtos da classe.

Faça o mesmo para o contato.

Da uma olhada no fonte.

public class Telefone {   
  
    private static int cod = 0;   
    private String num_Telefone;   

    private int codDaInstacia;
  
    public Telefone() {
          cod++;
         codDaIntancia = cod;
    }   
  
    public int getCod() {   
        return cod;   
    }   
  
    public String getNum_Telefone() {   
        return num_Telefone;   
    }   
  
    public void setNum_Telefone(String num_Telefone) {   
        this.num_Telefone = num_Telefone;   
    }   
  
}
M
rmello:
Voce não esta gerando a numeração seguencial, voce tem que colocar a variavel do obj que vai guardar o código de cada instancia e aribuir o valor no construtos da classe.

Faça o mesmo para o contato.

Da uma olhada no fonte.

public class Telefone {   
  
    private static int cod = 0;   
    private String num_Telefone;   

    private int codDaInstacia;
  
    public Telefone() {
          cod++;
         codDaIntancia = cod;
    }   
  
    public int getCod() {   
        return cod;   
    }   
  
    public String getNum_Telefone() {   
        return num_Telefone;   
    }   
  
    public void setNum_Telefone(String num_Telefone) {   
        this.num_Telefone = num_Telefone;   
    }   
  
}

Problema é o seguinte...

O contato pode ser ate sequencia e eu fiz deste modo, mas o problema e para cada contato tem um sequencia de 1 ate N numeros de telefone...

Do modo como citei deu certo sabe...se vc reparar...

Criado 14 de maio de 2012
Ultima resposta 16 de mai. de 2012
Respostas 15
Participantes 4