Modificadores de acesso e atributos de classe

16 respostas
E

Buenas pessoal...

Estou estudando "por conta" na apostila da Caelum (atualmente no cap6) e estou num impasse para modificar um código.

Já pesquisei no fórum, mas não encontrei nada diretamente relacionado.
Sei que é um exercício, mas como não frequento aulas regulares peço este apoio e ajuda para achar a solução.

O problema apresentado é o seguinte: Adicione um atributo na classe Funcionario de tipo int que se chama identificador. Esse identificador
deve ter um valor único para cada instância do tipo Funcionario. O primeiro Funcionario instanciado
tem identificador 1, o segundo 2, e assim por diante. Você deve utilizar os recursos aprendidos aqui para
resolver esse problema.
Crie um getter para o identificador. Devemos ter um setter?

Quanto ao setter digo que não há a necessidade, mas não sei em que ponto posso definir a atriuição do ID.

Meus códigos até o momento:

class Funcionario {
	private String nome;
	private String departamento;
	private double salario;
	private Data dataEntrada = new Data();
	private String rg;
	private boolean estaNaEmpresa;
	private static int uid;  //User ID como atributo de classe, mas não sei como referenciá-lo aos objetos
	
	// metodos

	//Contrutor funcionario
	Funcionario(String n, double s, String rg, Boolean in){
		this.nome = n;
		this.salario = s;
		this.rg = rg;
		this.estaNaEmpresa = in;
	}
	
	Funcionario(){
		
	}
	
	public void setNome(String n){
		this.nome = n;
	}
	
	public String getNome(){
		return this.nome;
	}
	
	public void setSalario(int s){
		this.salario = s;
	}
	
	public double getSalario(){
		return this.salario;
	}
	
	public void setRG(String rg){
		this.rg = rg;
	}
	
	public String getRG(){
		return this.rg;
	}
	
	public void setEstaNaEmpresa(boolean in){
		this.estaNaEmpresa = in;
	}
	
	public boolean getEstaNaEmpresa(){
		return this.estaNaEmpresa;
	}
	//aumenta o salário em x%
	void bonifica(double x){
		this.salario = this.salario*(x/100+1);
	}
	
	boolean demite(){
		if(this.estaNaEmpresa==false){
			System.out.println("Não é funcionário da empresa");
			return false;
		}else{
			System.out.println("Demitido!");
			this.estaNaEmpresa = false;
			return true;
		}
	}
	
	void mostra(){
		System.out.println("Nome: " + this.nome);
		System.out.println("Departamento: " + this.departamento);
		System.out.println("Salario: " + this.salario);
		System.out.println("Data Admissão: " + this.dataEntrada.dia + "/" + this.dataEntrada.mes + "/" + this.dataEntrada.ano);
		System.out.println("RG: " + this.rg);
		System.out.println("Esta Na Empresa: " + this.estaNaEmpresa);		
	}
	
}
class Empresa {
	//Outros atributos
	Funcionario[] funcionarios;
	String cnpj;
	String nome;
	int funcPos;  // Contador número de funcionários
		
	//métodos
	
	//Adicionar novo funcionário
	void adiciona(Funcionario f){
		if(funcPos < funcionarios.length ){
			this.funcionarios[funcPos] = new Funcionario(f.getNome(), f.getSalario(), f.getRG(), f.getEstaNaEmpresa());  //adiciona funcionário F na posição vazia
			
			System.out.println("Funcionario " + funcPos + " adicionado.\n");
			funcPos++;// posiciona Nfunc na próxima vazia
		}else{
			Funcionario[] temp = new Funcionario[funcionarios.length+1];
			
			for(int i=0;i<funcionarios.length;i++){
				temp[i]=this.funcionarios[i];
			}
			funcionarios = new Funcionario[temp.length];
			for(int i=0;i<funcionarios.length;i++){
				this.funcionarios[i] = temp[i];
			}
						System.out.println("Array agora com: " + funcionarios.length + " posições.\n\nFuncionario " + funcPos + " adicionado.\n");
			this.funcionarios[funcPos] = new Funcionario(f.getNome(), f.getSalario(), f.getRG(), f.getEstaNaEmpresa());  //adiciona funcionário F na posição vazia
			funcPos++;
		}
	}
	
	void imprimeSalario(){
		for(int i=0;i<this.funcPos;i++){
			System.out.println(this.funcionarios[i].getNome()+"   : "+this.funcionarios[i].getSalario());
		}
	}
	
	boolean contem(Funcionario f){
		for(int i=0;i<this.funcPos;i++){
			if(f.getEstaNaEmpresa()==true){
				System.out.println("Achei!");
				return true;
			}
		}
		System.out.println("Não está!!");
		return false;
	}
}
Minha classe de teste:
public class TesteEmpresa {
	public static void main(String[] args){
		Empresa empresa = new Empresa();
		empresa.funcionarios = new Funcionario[0];
		
		Funcionario f1 = new Funcionario("Joao",600,"1234",true);
		Funcionario f2 = new Funcionario("Pedro",1200,"5678",false);		
		Funcionario f3 = new Funcionario("Carlos",2000,"456456",true);
		Funcionario f4 = new Funcionario();
		f4.setNome("Luiz");
		f4.setSalario(1450);
		f4.setRG("192837");
		f4.setEstaNaEmpresa(true);
		
		empresa.adiciona(f1);
		empresa.adiciona(f2);
		empresa.adiciona(f3);
		empresa.adiciona(f4);
		
		empresa.imprimeSalario();
		empresa.contem(f1);
	}
}

16 Respostas

T

vc nao podde fazer isso no próprio construtor e quando o usuário digitar o ID vc comparar com os outros que já existem para não haver outro igual ???

sergiotaborda

estudier:
Buenas pessoal…

Estou estudando “por conta” na apostila da Caelum (atualmente no cap6) e estou num impasse para modificar um código.

Já pesquisei no fórum, mas não encontrei nada diretamente relacionado.
Sei que é um exercício, mas como não frequento aulas regulares peço este apoio e ajuda para achar a solução.

O problema apresentado é o seguinte: Adicione um atributo na classe Funcionario de tipo int que se chama identificador. Esse identificador
deve ter um valor único para cada instância do tipo Funcionario. O primeiro Funcionario instanciado
tem identificador 1, o segundo 2, e assim por diante. Você deve utilizar os recursos aprendidos aqui para
resolver esse problema.
Crie um getter para o identificador. Devemos ter um setter?

Quanto ao setter digo que não há a necessidade, mas não sei em que ponto posso definir a atriuição do ID.

Esse é o exercicio. quando vc entender onde colocar a atribuição vc terá entendido o conceito por detrás do exercicio.
Se lhe dissermos qual é , o que vc aprenderá ?

Pense no seguinte: A diferença entre a Classe e o Objeto e que o enunciado o instrui a criar o ID para cada instância, em seqüencia.

Nota: O usuário não vai dizer qual é o ID. ( por isso que não ha um setter, um modificador)

pimenta

Cara, concordo com o Sérgio Taborda, estude novamente os controles de acesso que você vai achar a resposta.

Só uma dica: Entenda o que é e como criar um atributo de classe.

thinet

Acho que deve ter algum incremento ai heim, tipo, a cada instância, se incrementa a variável estática, para que a próxima instância pegue um valor novo.

pimenta

thinet, incremento terá, mas a questão está em: Qual a diferença de um atributo de instância e um atributo de classe?

thinet

Atributo de classe é um para todos os objetos, enquanto a tributo de instância é único para cada instância

Se um objeto alterar um atributo de instância, somente o seu próprio atributo será modificado, enquanto que em um atributo de classe alterado, reflete para todos os objetos que acessem o mesmo.

pimenta

Exato, thinet, porém, como se cria um atributo de classe?

E

Pessoal,
eu entendi a definição de atributos de classe e de instância, o ponto é como fazê-lo.

Pelo que falaram aqui pensei da seguinte forma:
class Funcionario {   
    private String nome;   
    private String departamento;   
    private double salario;   
    private Data dataEntrada = new Data();   
    private String rg;   
    private boolean estaNaEmpresa;   
    private static int uid;  //User ID como atributo de classe   
    private int matricula;  //atributo do objeto;
   
    //Contrutor funcionario   
    Funcionario(String n, double s, String rg, Boolean in){   
        this.nome = n;   
        this.salario = s;   
        this.rg = rg;   
        this.estaNaEmpresa = in;
        this.matricula = Funcionario.uid;   //atribui valor único controlado pela classe
        Funcionario.uid++;  //incrementa o atributo da classe
    }   
...
}
Não tenho compilador aqui, mas acredito que isso resolva o meu problema. Se alguém puder verificar agradeço.

abraço.

pimenta

uid está sendo incrementado onde?

E

dentro do construtor

sergiotaborda

estudier:
Pessoal,
eu entendi a definição de atributos de classe e de instância, o ponto é como fazê-lo.
Não tenho compilador aqui, mas acredito que isso resolva o meu problema.
Se alguém puder verificar agradeço.

É isso ai.
Vc pode fazer tudo numa linha só.

this.matricula = Funcionario.uid++;
E

até tinha pensado nisso, mas como não teria como testar não quis arriscar.

me confirmem se a lógica é essa:

this.matricula = Funcionario.uid++; //atribui e depois incrementa UID this.matricula = ++Funcionario.uid; //Incrementa UID e só depois atribui

outra dúvida:
Devo inicializar o atributo Funcionario.uid ou ele será inicializado como 0 na criação?

sergiotaborda

estudier:
até tinha pensado nisso, mas como não teria como testar não quis arriscar.

me confirmem se a lógica é essa:

this.matricula = Funcionario.uid++; //atribui e depois incrementa UID this.matricula = ++Funcionario.uid; //Incrementa UID e só depois atribui

Sim é isso.

O java inicializará com zero, mas é boa prática iniciar explicitamente neste caso já que se trata de um método estático que a própria classe usa.

E

posso fazer da seguinte forma para começar em 1 direto?

private static int uid=1;
sergiotaborda

estudier:
posso fazer da seguinte forma para começar em 1 direto?

private static int uid=1;

Sim.

E

Sergio,
obrigado pela ajuda.

Funcionou perfeitaamente como eu esperava.

Criado 1 de julho de 2008
Ultima resposta 6 de jul. de 2008
Respostas 16
Participantes 5