Getters e Setters em Java: A Porta de Entrada para os Campos de uma Classe
Bem-vindos ao mundo de Java, onde os conceitos de getters e setters formam a base da interação com os atributos de uma classe. Ao iniciar no universo da programação orientada a objetos, um dos primeiros tópicos que você encontrará são esses dois tipos de métodos. Vamos desvendar o propósito dos getters e setters e como eles são usados em um cenário prático com os arquivos DemonstracaoPoo.java
e Funcionario.java
. O full source code dessas classes está aqui.
O Conceito de Getters e Setters
Imagine que você tem um cofre com informações valiosas. Para proteger o conteúdo, você não deixaria a chave disponível para qualquer um, certo? Da mesma maneira, em programação, nem sempre queremos que os dados de um objeto sejam acessados ou modificados diretamente. Aqui entram em cena os getters e setters: métodos que nos permitem ler (get) e escrever (set) os valores dos campos (ou atributos) de um objeto de maneira controlada.
Getters: Acessando os Valores
Um getter é um método que lê e retorna o valor de um campo privado de um objeto. O nome do método normalmente começa com ‘get' seguido pelo nome do campo com a primeira letra maiúscula. Para o campo horasTrabalhadas
da nossa classe Funcionario
, temos o seguinte getter:
1 2 3 4 5 |
public int gethorasTrabalhadas() { return horasTrabalhadas; } |
Este método permite que outras classes vejam quantas horas um funcionário trabalhou sem alterar esse valor diretamente.
Setters: Modificando os Valores
Por outro lado, um setter é um método que define ou atualiza o valor de um campo privado. O nome geralmente começa com ‘set', e semelhante ao getter, é seguido pelo nome do campo com a primeira letra em maiúscula. Na mesma classe Funcionario
, o setter correspondente seria:
1 2 3 4 5 6 7 8 9 10 |
public void sethorasTrabalhadas(int hours) { if (hours > 0) { horasTrabalhadas = hours; } else { System.out.println("Error: horasTrabalhadas Cannot be Smaller than Zero"); System.out.println("Error: horasTrabalhadas is not updated"); } } |
Com esse método, podemos definir a quantidade de horas trabalhadas por um funcionário, garantindo que o valor seja positivo e válido.
A Importância de Getters e Setters
Getters e setters são fundamentais por várias razões:
- Encapsulamento: Eles escondem a representação exata e a obtenção de dados, permitindo que a lógica interna de como os dados são mantidos possa ser alterada sem afetar as classes que a utilizam.
- Validação: Como visto no setter acima, você pode verificar a validade dos dados antes de atribuí-los ao campo.
- Flexibilidade: Se no futuro precisarmos mudar a forma como os dados são obtidos ou definidos, podemos fazer isso em um único local sem mexer em todas as partes do código onde o campo é acessado.
- Controle: Podemos controlar como os dados são acessados e modificados, talvez registrando toda vez que um valor é alterado ou emitindo uma notificação.
Utilizando Getters e Setters na Prática
Para utilizar os getters e setters em nosso código, vamos olhar para a classe principal DemonstracaoPoo
:
1 2 3 4 5 6 7 8 |
public static void main(String[] args) { Funcionario funcionario1 = new Funcionario("Peter"); funcionario1.sethorasTrabalhadas(160); // Usando setter para definir horas trabalhadas int horas = funcionario1.gethorasTrabalhadas(); // Usando getter para obter horas trabalhadas System.out.println("Horas Trabalhadas = " + horas); } |
Nesse trecho, estamos manipulando o campo horasTrabalhadas
de maneira segura, através dos métodos disponibilizados pela classe Funcionario
.
Conclusão
Getters e setters são essenciais para a escrita de código Java limpo, organizado e seguro. Eles são uma parte integral do encapsulamento em programação orientada a objetos e ajudam a proteger os dados internos do objeto. Ao compreender e aplicar corretamente os getters e setters, você não apenas melhora a qualidade do seu código, mas também prepara a base para práticas mais avançadas em desenvolvimento de software. Comece a usar getters e setters em seus programas Java e você estará a caminho de criar aplicações robustas e fáceis de manter.