Dúvida iniciante - getters / setters

6 respostas
R

Olá,

Sou iniciante em Java e estou estudando pelo livro do Deitel 8° edição.
Fiz o exercício 3.16 (Calculadora de frequência cardíaca) e fiquei com uma dúvida.
No enunciado pede para usar set / get.

Minha dúvida é: Sempre tenho que usar esta metodologia?

Percebi que poderia fazer tudo em um método public (sem ser void) que receberia os dados da classe de teste e retornaria um valor com o “return”.

Segue o exercício:

> // Exerc 3.16: HeartRates.java
> // classe HeartRates para informar idade, frequência cardíaca máxima e
> // intervalo de frequência cardíaca alvo.
> import java.util.Date;
> import java.text.SimpleDateFormat;
> import java.text.ParseException;

> public class HeartRates {
>   private String userName; //nome para este HeartRates
>   private String userSobrenome; //sobrenome para este HeartRates
>   private String userDateNasc; // String data de nascimento
>   private Date aniversario; // Date data de nascimento
>   private int idade; // idade
>   private int fcm;
>   
>   // setters
>   
>   // método para configurar o nome e sobrenome
>   public void setUser ( String name, String sobrenome ) {
>     userName = name; //armazena o nome
>     userSobrenome = sobrenome; // armazena o sobrenome
>   } // fim do método setUser
>   
>   // método para definir idade 
>   public void setNascimento( String dia, String mes, String ano) {
>     SimpleDateFormat dt = new SimpleDateFormat( "dd/MM/yyyy" ); // cria formatação para data
>     Date now = new Date(); // cria data atual
>     userDateNasc = dia + "/" + mes + "/" + ano; // concatena data de nacimento do usuário
>   
>     try {
>       aniversario = dt.parse( userDateNasc ); // transformada String para Date para cálculo da idade
>     } catch (ParseException ex) {
>       ex.printStackTrace();
>     } // fim do catch

>     userDateNasc = dt.format( aniversario ); // transforma Date para String para imprimir
>     
>     // Calcula idade
>     idade = now.getYear() - aniversario.getYear() - 1; 
>     if (now.getMonth() > aniversario.getMonth())
>       idade++;
>     else if (now.getMonth() == aniversario.getMonth() && now.getDay() >= aniversario.getDay())
>       idade++;
>   } // fim do método setNascimento
>   

>   // getters
>   
>   // Método para recuperar o nome
>   public String getUserName() {
>     return userName;
>   } // fim do método getUserName
>   
>   // Método para recuperar o sobrenome
>   public String getUserSobrenome() {
>     return userSobrenome;
>   } // fim do método getUserSobrenome
>     
>   // Método para recuperar data
>   public String getDataNasc() {
>     return userDateNasc;
>   } // fim do método getDataNasc

>   // método para recuperar idade
>   public int getIdade() {
>     return idade;
>   } // fim do método getIdade
>     
>   // método para recuperar frequência cardíaca máxima
>   public int getFcm() {
>     return 222 - getIdade();
>   } // fim do método getFcm
>     
>   public void displayMessage() {
>     // chama getUserName para obter o nome
>     System.out.printf( "Nome: %s\n",
>       getUserName() );
>     // chama getUserSobrenome para obter o sobrenome
>     System.out.printf( "Sobrenome: %s\n",
>        getUserSobrenome() );
>     // chama getDataNasc para obter data de nascimento
>     System.out.printf( "Data de Nascimento: %s\n",
>         getDataNasc() );
>     // chama getIdade para obter a idade
>     System.out.printf( "Idade: %d\n",
>         getIdade() );
>     // chama getFcm para obter a frequência cardíaca máxima
>     System.out.printf( "Frequência Cardíaca Máxima: %d BPM\n",
>         getFcm() );
>     // chama getFcm para clacular intervalo de frequência cardíaca alvo, entre 50% e 85%
>     // da frequeência cardíaca máxima
>     System.out.printf( "intervalo de frequência cardíaca alvo: %.0f até %.0f BPM\n", 
>         getFcm() * 0.50, getFcm() * 0.85 );
>   } // fim do método displayMessage
> } // fim da classe acount

Classe de teste:

// Exerc 3.16: HeartRatesTD.java
// criando um objeto HeartRates e passa as informações para
// o objeto heartRates
import javax.swing.JOptionPane; // importa classe JOptionPane

public class HeartRatesTD
{
  // Método main inicia a execução do programa.
  public static void main( String[] args )
  {
    HeartRates heartRates = new HeartRates(); // Cria um objeto HeartRates e o atribui a heartRates
    
    // Pede para o usuário inserir seu nome
    String setName = JOptionPane.showInputDialog( "Qual o seu Nome?" );
    // Pede para o usuário inserir seu sobrenome
    String setSobrenome = JOptionPane.showInputDialog( "Qual o seu Sobrenome?" );
    // Pede para o usuário inserir seu sobrenome
    String setDia = JOptionPane.showInputDialog( "Qual o seu dia de nascimento (dd)?" );
    // Pede para o usuário inserir seu sobrenome
    String setMes = JOptionPane.showInputDialog( "Qual o seu mês de nascimento (mm)?" );
    // Pede para o usuário inserir seu sobrenome
    String setAno = JOptionPane.showInputDialog( "Qual o seu ano de nascimento (aa)?" );
    
    heartRates.setUser( setName, setSobrenome ); // configura nome e sobrenome
    heartRates.setNascimento( setDia, setMes, setAno ); // configura data de nascimento
    
    // Exibe informações do usuário e frequências cardíacas
    heartRates.displayMessage();
  } // fim do método main
} // fim da classe HeartRatesTD

Obrigado.

6 Respostas

R

Boa noite,

Na verdade os getters e setter vão ser utilizados para você dispor os atributos que até então era privados(private). Isso talvez você até já tenha visto no Deltel e se chama “Encapsulamento”, que você só vai dispor o que for necessário para os objetos que instanciarem sua classe. Se você for para e pensar uma grande aplicação nem é todos os atributos que vamos fazer getters e setter.

Basta eu lhe dizer que o getters só usamos se REALMENTE queremos disponilizar/ilustrar um valor e os setters se quiserem disponibilizar para alterar valores.

N

Minha dúvida é: Sempre tenho que usar esta metodologia?

É aconselhado que se use, pois o uso dos get e set, são umas das principais características de linguagens orientadas a objetos, assegura classes, organiza e controla acesso a atributos, é utilizada como boas práticas, e se faz necessário o uso para ter as funcionalidades da maioria dos frameowrks.

Alguns links:

DeveMedia
Caelum

R

Boa tarde,
Estou começando a entender o conceito. No caso do exercício, para imprimir o nome, sobrenome, data de nascimento e idade, não precisaria utilizar os getters, pois não retorna nenhum valor para a classe main. Poderia imprimir diretamente da variável.

J

Você tem razão em achar chato. Problema é que o Java é muito verboso mesmo, no C# por exemplo get/set podem ser implícitos para o programador, sem aquele bando de métodos get/set explícitos do Java que na maioria das vezes não tem nada implementado pelo programaor.

D

@javaflex a lógica é a mesma para C#, há uma grande confusão nisso, então, cuidado em falar implicito e explicito, porque em C# também segue a mesma idéia de JAVA, seus modificadores e sua nomenclatura muitas vezes não são seguidas.!

R

Obrigado pessoal pelos esclarecimentos. Irei pesquisar mais sobre o assunto.
Mas estou começando a entender o conceito com outros exercícios.

Criado 13 de agosto de 2016
Ultima resposta 17 de ago. de 2016
Respostas 6
Participantes 5