Modificadores de acesso e atributos de classe

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:

[code]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);		
}

}
[/code]

[code]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;
}

}
[/code]

Minha classe de teste:

[code]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);
}

}
[/code]

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 ???

[quote=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.
[/quote]

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)

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.

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.

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

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.

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

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:

[code]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
}   


}[/code]
Não tenho compilador aqui, mas acredito que isso resolva o meu problema.
Se alguém puder verificar agradeço.

abraço.

uid está sendo incrementado onde?

dentro do construtor

[quote=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.
[/quote]

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

        this.matricula = Funcionario.uid++;   

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?

[quote=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
[/quote]

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.

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

private static int uid=1;

[quote=estudier]posso fazer da seguinte forma para começar em 1 direto?

private static int uid=1;

[/quote]

Sim.

Sergio,
obrigado pela ajuda.

Funcionou perfeitaamente como eu esperava.