Java Efetivo Item 16
Tags: java, programming
Published: 2024-02-15 21:42:22

### **Use os métodos getters em classes públicas e não os campos públicos**

O Item 16 aborda a prática de utilizar métodos getters em classes públicas em vez de expor diretamente os campos públicos. Quando os campos de uma classe são acessados diretamente, isso pode comprometer o encapsulamento, tornando difícil modificar a representação interna da classe sem afetar a API, impor invariantes ou realizar ações adicionais quando um campo é acessado.

Para classes públicas, é fundamental fornecer métodos getters para acessar os campos, pois isso preserva a flexibilidade para alterar a representação interna da classe sem impactar o código do cliente. Expor diretamente os campos de dados em classes públicas pode resultar em uma situação onde qualquer alteração na representação interna da classe afetaria o código do cliente, distribuído por toda parte.

No entanto, para classes pacote-privado ou classes privadas aninhadas, expor os campos de dados diretamente pode ser aceitável, desde que os campos descrevam adequadamente a abstração fornecida pela classe. Isso pode resultar em menos poluição visual do que a utilização de getters e setters, especialmente quando o código do cliente está contido no mesmo pacote que a classe.

Embora muitas classes nas bibliotecas da plataforma Java violem essa recomendação, como as classes Point e Dimension no pacote java.awt, é importante aprender com esses exemplos. Por exemplo, a exposição dos internos da classe Dimension resultou em problemas de desempenho significativos, conforme descrito no Item 67.

Em resumo, é crucial que as classes públicas utilizem métodos getters em vez de expor diretamente os campos públicos, para preservar a flexibilidade e evitar problemas de encapsulamento. Embora seja menos problemático para classes com campos imutáveis, ainda é questionável e, em alguns casos, necessário, para classes pacote-privado ou privadas aninhadas exporem seus campos, seja mutáveis ou imutáveis.

Claro, aqui estão alguns exemplos de código em Java com comentários sobre as recomendações do Item 16:

```
// Exemplo de uma classe pública com campos públicos
public class Pessoa {
    public String nome;
    public int idade;
    
    // Método construtor
    public Pessoa(String nome, int idade) {
        this.nome = nome;
        this.idade = idade;
    }
}

// Exemplo de uso incorreto da classe Pessoa
public class Main {
    public static void main(String[] args) {
        Pessoa pessoa = new Pessoa("João", 30);
        System.out.println("Nome: " + pessoa.nome); // Acesso direto ao campo público
        System.out.println("Idade: " + pessoa.idade); // Acesso direto ao campo público
    }
}

```
Neste exemplo, a classe Pessoa expõe seus campos publicamente, o que compromete o encapsulamento. Se precisarmos modificar a representação interna da classe Pessoa, todos os lugares que acessam diretamente seus campos precisarão ser atualizados manualmente.

Vamos agora ajustar a classe Pessoa para seguir as boas práticas:

```
// Exemplo de uma classe pública com métodos getters
public class Pessoa {
    private String nome;
    private int idade;
    
    // Método construtor
    public Pessoa(String nome, int idade) {
        this.nome = nome;
        this.idade = idade;
    }
    
    // Métodos getters para acessar os campos privados
    public String getNome() {
        return nome;
    }
    
    public int getIdade() {
        return idade;
    }
}

// Exemplo de uso correto da classe Pessoa com métodos getters
public class Main {
    public static void main(String[] args) {
        Pessoa pessoa = new Pessoa("João", 30);
        System.out.println("Nome: " + pessoa.getNome()); // Acesso por meio do método getter
        System.out.println("Idade: " + pessoa.getIdade()); // Acesso por meio do método getter
    }
}

```
Neste segundo exemplo, a classe Pessoa agora utiliza métodos getters para acessar seus campos privados, seguindo as recomendações do Item 16. Isso preserva o encapsulamento e permite que a representação interna da classe seja modificada sem afetar o código do cliente.