Criação de métodos get e set para uma array de classe

16 respostas
JorjaoCorreia

Boa noite!

Tenho 3 classes, uma de Funcionário:

class Funcionario {
	private String nome;
	private String departamento;
	private double salario;
	Data dataEntrada = new Data();
	private boolean estaNaEmpresa = true;
	private static int identificador;
	
	public Funcionario() {
		Funcionario.identificador = Funcionario.identificador + 1;
	}
	
	public double bonifica(double aumento) {
		this.salario += aumento;
		return salario;	
	}
	
	public void demite() {
		this.estaNaEmpresa = false;
	}
	
	public void mostra() {
		System.out.println("Nome: " 			+ getNome() + "\n" +
						   "Departamento: "		+ getDepartamento() + "\n" +	
						   "Salario: "			+ getSalario() +	"\n" +
						   "Data de entrada: "	+ this.dataEntrada.getDia() + "." + this.dataEntrada.getMes() + "." + this.dataEntrada.getAno() + "\n" +
						   "Esta na empresa? "	+ this.estaNaEmpresa + "\n" +
						   "Foram criados: "	+ getIdentificador() + " instancias da classe Funcionario!");
	}		

	public String getNome() {
		return this.nome;
	}
	
	public void setNome(String nome) {
		this.nome = nome;
	}
	
	public double getSalario() {
		return this.salario;
	}
	
	public void setSalario(double salario) {
		this.salario = salario;
	}
	
	public void setDepartamento(String departamento) {
		this.departamento = departamento;
	}
	
	public String getDepartamento() {
		return this.departamento;
	}
	
	public int getIdentificador() {
		return this.identificador;
	}
	
	public boolean isEstaNaEmpresa() {
		return this.estaNaEmpresa;
	}
	
	public boolean setEstaNaEmpresa(boolean estaNaEmpresa) {
		return this.estaNaEmpresa = estaNaEmpresa;
	}
}

Uma de empresa:

class Empresa {
	private String nome;
	private String cnpj;
	private Funcionario[] empregados;
	
	public String getNome() {
		return this.nome;
	}
	
	public String setNome(String nome) {
		return this.nome = nome;
	}
	
	public String getCnpj() {
		return this.cnpj;
	}
	
	public String setCnpj(String cnpj) {
		return this.cnpj = cnpj;
	}
	
	public void setEmpregados(Funcionario f) {
		int x = 0;
		boolean cond = true;
		while (cond == true) {
			if (empregados[x] == null) {
				this.empregados[x] = f;								
				cond = false;				
			} else {
				x++;			
			}
		}
	}
	
	public Funcionario getEmpregados (int posicao) {
		return this.empregados[posicao];
	}
	
	public void contem(Funcionario f) {
		if (f.isEstaNaEmpresa() == true) {
			System.out.println("O funcionario esta na empresa!");				
		} else {
			System.out.println("O funcionario nao esta na empresa!");				
		}
	}	
}

E uma para incluir dados e testar os dados da classe Empresa:

class TestaEmpresa {
	public static void main (String[] args) {
		Empresa empresa = new Empresa();
		
		Funcionario f1 = new Funcionario();
		f1.setSalario(500);
		f1.setNome("Jorge");
		f1.setEstaNaEmpresa(false);
		f1.setDepartamento("Suporte");
		f1.dataEntrada.setDia(01);
		f1.dataEntrada.setMes(01);
		f1.dataEntrada.setAno(2012);
				
		empresa.setEmpregados(f1);
		empresa.getEmpregados(0);
		empresa.contem(f1);	
	}
}

O problema é que não estou conseguindo criar os métodos get e set da minha array da classe funcionários corretamente.
Da maneira que criei, ao executar a classe TestaEmpresa é exibido pela JVM um erro de NullPointerException. Alguém tem uma ideia de como eu poderia criar estes gets e sets?

Obs: Antes de adicionar um funcionário na classe preciso verificar qual posição da array está vazia e adicionar as informações nesta posição do array.

Obrigado.

16 Respostas

wagnerfrancisco

Primeiro eu sugiro que você altere a nomenclatura dos métodos. O método setEmpregados, na verdade, deveria se chamar addEmpregado. Ele recebe apenas um empregado e adiciona na empresa. Se ele de fato recebesse um array com todos os empregados da empresa, aí sim seria correto chamá-lo de setEmpregados. O mesmo ocorre com o método getEmpregados. Você está retornando apenas 1 empregado, portanto o correto seria chamá-lo de getEmpregado.

Perceba que um array precisa ser inicializado com um tamanho fixo. Você não inicializou ele em nenhum momento, por isto você recebe uma NullPointerException. Você pode inicializar na própria declaração:

private Funcionario[] empregados = new Funcionario[10];

Isto lhe permitiria adicionar 10 empregados. Pra você não ficar limitado a um tamanho fixo, sugiro que utilize, ao invés do array, um Set ou um List. Eles não tem esta limitação.

Um outro problema está no seu algoritmo de busca de uma posição nula (setEmpregados). Se você inserir os 10 registros, vai receber um IndexArrayOutOfBoundsException quando tentar inserir o 11. Você precisa buscar somente dentro do limite de tamanho do array.

JorjaoCorreia

Entendo, vou corrigir o algoritmo e verificar como ficou. Obrigado wagnerfrancisco.

JorjaoCorreia

Ok, o problema de NullPointerException foi resolvido, não estou recebendo este erro ao compilar o programa,
mas meus métodos set(que seria o add) e o get não estão funcionando corretamente, aparentemente os valores não estão sendo setados
e o get não está retornando os dados do funcionário, o que estou fazendo de errado?

Segue abaixo os métodos:

public void setEmpregados(Funcionario f) {
		int x = 0;
		boolean cond = true;
		while (cond == true) {
			if (empregados[x] == null) {
				this.empregados[x] = f;								
				cond = false;				
			} else {
				x++;			
			}
		}		
	}
public Funcionario getEmpregados (int posicao) {
		return this.empregados[posicao];
	}

Obs: As classes e métodos são os mesmos de quando criei o tópico no forum.

wagnerfrancisco, não corrigi as nomenclaturas porque pretendo adicionar mais funcionários, estou realizando o teste com apenas 1 para corrigir os erros. E referente ao erro IndexArrayOutOfBoundsException ao adicionar mais de 10 funcionários, não há problema, estou fazendo este algoritmo apenas para aprendizado, estou aprendendo a trabalhar com encapsulamento e construtores por enquanto.

Obrigado.

jeffev

JorjaoCorreia:
Ok, o problema de NullPointerException foi resolvido, não estou recebendo este erro ao compilar o programa,
mas meus métodos set(que seria o add) e o get não estão funcionando corretamente, aparentemente os valores não estão sendo setados
e o get não está retornando os dados do funcionário, o que estou fazendo de errado?

Segue abaixo os métodos:

public void setEmpregados(Funcionario f) {
		int x = 0;
		boolean cond = true;
		while (cond == true) {
			if (empregados[x] == null) {
				this.empregados[x] = f;								
				cond = false;				
			} else {
				x++;			
			}
		}		
	}
public Funcionario getEmpregados (int posicao) {
		return this.empregados[posicao];
	}

Obs: As classes e métodos são os mesmos de quando criei o tópico no forum.

wagnerfrancisco, não corrigi as nomenclaturas porque pretendo adicionar mais funcionários, estou realizando o teste com apenas 1 para corrigir os erros. E referente ao erro IndexArrayOutOfBoundsException ao adicionar mais de 10 funcionários, não há problema, estou fazendo este algoritmo apenas para aprendizado, estou aprendendo a trabalhar com encapsulamento e construtores por enquanto.

Obrigado.

Já debugou para ver se esta caindo no seu if?

if (empregados[x] == null) { this.empregados[x] = f; cond = false; }

JorjaoCorreia

jeffev, não estou usando nenhuma IDE, estou usando o compilador do Java mesmo por enquanto.

jeffev

Coloca um print só pra ver se entra nesse if.

J

E ae Jorjao, seguinte, aparentemente seus métodos set e get de Empregados estão ok, faz o seguinte:

empresa.getEmpregados(0);

Atribui o código acima à uma variável e em seguinte da um system.out.printl, assim:

Funcionario[] funcionario = empresa.getEmpregados(0);
System.out.println(funcionario.getNome());

E ve se vai imprimir Jorge, ai está tudo ok com seus métodos :wink:

JorjaoCorreia

jcandinho.junior, assim são retornados os valores, acredito que o problema esteja no método get então pois o set está setando os valores corretamente.
Alguma dica de como eu posso fazer este get funcionar?

Obrigado.

wagnerfrancisco

O método get está retornando null? Tá dando algum erro?

Posta mais detalhado para entendermos melhor.

JorjaoCorreia

wagnerfrancisco, ele não retorna nada. É como se eu não estivesse chamando o método pra apresentar o resultado.

J

Tu fez o que eu falei?
Atribuir o get para uma variável e depois dar um system.out no na variável?

D

Na classe Funcionario, linha 8

private static int identificador;

identificador é static você tem que atribuir um valor para ele.

private static int identificador = 0;
JorjaoCorreia

jcandinho.junior, sim, conforme eu disse ali se eu atribuir o get pra uma variável e imprimir utilizando o System.out os valores são impressos,
mas somente com o método get não é impresso nada. Estou fazendo algo errado no método get, mas não sei o que.

Alguém tem uma ideia do que pode ser?

wagnerfrancisco

JorjaoCorreia:
jcandinho.junior, sim, conforme eu disse ali se eu atribuir o get pra uma variável e imprimir utilizando o System.out os valores são impressos,
mas somente com o método get não é impresso nada. Estou fazendo algo errado no método get, mas não sei o que.

Alguém tem uma ideia do que pode ser?

Mas tu sempre precisa do System.out.println pra imprimir. Só o get não vai imprimir mesmo, o que tu pode é ao invés de atribuir a uma variável, passar o método get como parâmetro diretamente.

JorjaoCorreia

wagnerfrancisco, eu achei que só criado o método get os dados seriam retornados todos desorganizados, mas seriam retornados.
Ja corrigi o método get, agora os resultados estão sendo retornados corretamente. Deixei desta maneira:

public Funcionario getEmpregados (int posicao) {
		System.out.println("Salario: " 					  + empregados[posicao].getSalario());
		System.out.println("Nome: " 				          + empregados[posicao].getNome());
		System.out.println("Esta na empresa? "			  + empregados[posicao].isEstaNaEmpresa());
		System.out.println("Departamento: " 		                  + empregados[posicao].getDepartamento());
		System.out.println("Dia/Mes/Ano de contratacao: "         + empregados[posicao].dataEntrada.getDia() + "/" + empregados[posicao].dataEntrada.getMes() + "/" +                                     empregados[posicao].dataEntrada.getAno());
		return this.empregados[posicao];
	}

Ai é só passar a posição que eu quero verificar ao chamar o método get que os dados são retornados certinho. Obrigado pessoal, especialmente o wagnerfrancisco :stuck_out_tongue:

F
JorjaoCorreia:
jcandinho.junior, sim, conforme eu disse ali se eu atribuir o get pra uma variável e imprimir utilizando o System.out os valores são impressos, mas somente com o método get não é impresso nada. Estou fazendo algo errado no método get, mas não sei o que.

Alguém tem uma ideia do que pode ser?

O atributo identificador usa o modificador "static", entao voce deveria fazer o metodo assim

    public static int getIdentificador() {
		return identificador;
    }
 
 


Também mudaria o setEmpregados


 
    public boolean addEmpregados(Funcionario f) {  
             
        try {
        	this.empregados[this.i] = f;
        	this.i++;
        	return true;
        } catch (IndexOutOfBoundsException e){
        	System.out.printf ("Tamanho Array %s \"Status Cheia\" " , e.getMessage());
        	return false;
        }      
       
    }

Me corrijam se eu estiver errado, pois tbm sou iniciante em Java.

Criado 16 de agosto de 2012
Ultima resposta 4 de abr. de 2013
Respostas 16
Participantes 6