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.
Top comments (0)