Duvida sobre exercício de encapsulamento

16 respostas
F

Olá pessoal estou com algumas duvidas nesse exercício:

Escreva uma classe Java que representa uma Pessoa, com os atributos nome (String) e ano de Nascimento (int);

Esta classe deve ser encapsulada com méodos get e set

Inclua mais um método:

public int getIdade(){

  // implementar o código através do ano atual menos o ano de nascimento.

}

Crie uma classe Principal onde em seu método main seja instanciado um objeto da classe Pessoa e populado seus valores. Após terem sido preenchidos os dados do objeto, chame um método na mesma classe para imprimir tais informações.

O método pode ter a seguinte assinatura:

public static void imprimir(Pessoa pessoa){

      //imprimir o objeto

}

Minhas dúvidas são como implementar o código do ano atual menos o ano de nascimento, no caso terei de usar APIs como java.util.date. ou java.util. calendar??

E sobre o método princinpal como imprimir em um método os atributos do objeto no caso como ele pede: public static void imprimir(Pessoa pessoa){

//imprimir o objeto

Fiz a classe Pessoa

package exercicio4;

public class Pessoa {
	
	private  String nome;
	private int idade;
	private int anoDeNascimento;
	public int getIdade() {
		
		return idade;
	}
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	public int getAnoDeNascimento() {
		return anoDeNascimento;
	}
	public void setAnoDeNascimento(int anoDeNascimento) {
		this.anoDeNascimento = anoDeNascimento;
	}
	public void setIdade(int idade) {
		this.idade = idade;
	}
	
}

16 Respostas

D

Primeiro, sobre como calcular a idade: depende da tua entrada. Vai ler como String mesmo? Se sim, pode ler dia, mês e ano isoladamente, converter cada um para inteiro e daí o resto você sabe…
Segundo, se você passa o objeto Pessoa, há duas maneiras: uma delas você não deve ter visto ainda (polimorfismo no método toString) e a outra, que é a que eu penso que teu professor deseja, invocar cada getter presente no objeto passado como parâmetro.

F

Poderia demonstrar como ficaria o código da classe principal?

Obrigado.

D

Não! Isso é tarefa tua, certo? Você é quem está aprendendo.

F

Sem exemplos fica difícil de aprender.

P

tema de casa:

System.out.println( new Date());

o que isso imprime? a data de hoje?

agora saca só quantos metodos vc tem:

https://docs.oracle.com/javase/8/docs/api/java/util/Date.html

F

Valeu colega, perguntei do professor e ele disse que pode digitar a entrada do ano manualmente, o que vai deixar mais fácil.

J

Calendar.getInstance().get(Calendar.YEAR)

P

Se vc socar 2016 no seu código vai funcionar
Mas é feio.
Sugiro vc fazer feio e deixar o programa funcionando e no final troca por uma manera de detectar o ano corrente via Date ou Calendar.

Pq às vezes é codigo demais e erros bobos passam desapercebidos. Quanto menos codigo e mais legível, melhor:)

F

Era exatamente isso que pretendia fazer, usar o Date ou o Calendar.

F

Olá pessoal já consegui resolver o exercício, foi relativamente fácil, achei interessante e gostaria de saber se existe um método para calcular idade atraves da data de nascimento completa tipo dd/mm/aaaa da data atual menos dd/mm/aaaa da data de nascimento.

F

Valeu sua resposta ajudou muito.

R

Um exemplo de como poderia fazer:

String dtNascimento = "27/10/1980";
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
try{
	Calendar cal = Calendar.getInstance();
	cal.setTime(sdf.parse(dtNascimento));
	int idade = Calendar.getInstance().get(Calendar.YEAR) - cal.get(Calendar.YEAR);
	System.out.println(idade); // resultado 36
}catch(ParseException pe){
	pe.printStackTrace();
}
F

Muito bom colega, onde eu implementaria esse codigo, na classe pessoa ou classe principal?

R

Você pode implementar um método dentro da entidade Pessoa com a responsabilidade de calcular a idade e chamar no getIdade().

Eu removeria o atributo idade e o método setIdade e criaria o método de calcularIdade() sendo chamado no getIdade(), desta forma:

private int calcularIdade(){
  SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
  Calendar cal = Calendar.getInstance();
  try{     
    cal.setTime(sdf.parse(this.dataNascimento));
  }catch(ParseException pe){
    pe.printStackTrace();
  }
  return Calendar.getInstance().get(Calendar.YEAR) - cal.get(Calendar.YEAR);
}

public int getIdade(){
  return calcularIdade();
}

Assim sendo, poderia ser chamado desta forma:

Pessoa p = new Pessoa();
p.setNome("Teste");
p.setDataNascimento("27/10/1989");

Syste.out.println(p.getIdade()); // 36
F

Excelente, vou já testar, valeu mesmo chapa.

F

Testei esse código e ainda não ficou do jeito que eu queria ae quando usei esse aqui ficou perfeito

private int calcularIdade() {
	DateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
	Date dataNascimentoInput = null;
	
	try {
		
		dataNascimentoInput = sdf.parse(dataNascimento);
	  
	} catch (Exception e){}
	
	Calendar dateOfBirth = new GregorianCalendar();
	dateOfBirth.setTime(dataNascimentoInput);
	Calendar today = Calendar.getInstance();
	int age = today.get(Calendar.YEAR) - dateOfBirth.get(Calendar.YEAR);
	
	dateOfBirth.add(Calendar.YEAR, age);
	if (today.before(dateOfBirth)) {
		
		age--;
		
	}

	return age;
}
Criado 24 de outubro de 2016
Ultima resposta 28 de out. de 2016
Respostas 16
Participantes 5