Olá, estudante! Agora que você já está por dentro de classes, atributos e métodos, vamos aprofundar um pouco mais nestas características, explorando os modificadores de acesso. O principal objetivo dessa lição será fornecer uma compreensão sólida desses modificadores para que você compreenda como eles influenciam a visibilidade e o encapsulamento dos membros de uma classe e da segurança em POO. Além disso, você irá identificar os três principais modificadores de acesso, sendo eles, o public, private e protected, e entenderá suas implicações no design de classes e na segurança do código.
Ao final dessa lição, você será capaz de aplicar esses modificadores de acesso de forma eficaz em seus próprios projetos, garantindo o encapsulamento adequado, a reutilização de código e a proteção contra acesso não autorizado.
Imagine que você está trabalhando no desenvolvimento de um sistema de controle de acesso para uma empresa de alta segurança. Esse sistema é responsável por gerenciar quem tem permissão para acessar áreas restritas da empresa. No cadastro de usuários você precisa criar uma classe para representar os usuários do sistema como de costume. Cada usuário tem informações confidenciais, como nome, identificação e nível de acesso. Diante disso, como garantir que essas informações sejam acessíveis apenas internamente à classe, para proteger a privacidade dos usuários? Sabemos que o sistema precisa ser extensível, permitindo a adição de novos tipos de usuários no futuro, porém, como garantir que as subclasses possam herdar e substituir métodos, mas não acessem informações ou comportamentos exclusivos da classe pai?
Talvez nesse primeiro momento, você não saiba responder essas perguntas, mas te adianto que, nessas situações, os modificadores de acesso desempenham um papel crucial, pois permitem controlar a visibilidade e o acesso a classes, atributos e métodos, garantindo o encapsulamento e a segurança do sistema. Portanto, a escolha e o uso adequado desses modificadores são fundamentais para resolver essas questões e criar um sistema de controle de acesso robusto e seguro.
Agora que começou a entender onde eles podem ser usados, o que acha de aprofundar nossos conhecimentos no assunto?
O case fictício de hoje é sobre a empresa E-Shop que opera uma plataforma on-line para vendas de produtos. Ela enfrentou desafios significativos em relação à segurança e ao gerenciamento de seus sistemas internos e são esses desafios que apresentarei à você.
O primeiro desafio é sobre o acesso aos dados dos clientes, pois a E-Shop armazena informações confidenciais de seus clientes, como detalhes de pagamento e histórico de compras. Eles precisavam garantir que apenas partes específicas do sistema tivessem acesso a esses dados e que nenhuma informação fosse comprometida. Então, como solução, a equipe de desenvolvimento aplicou o modificador de acesso "private" aos atributos que continham informações sensíveis dos clientes. Isso garantiu que esses atributos fossem acessíveis apenas internamente à classe de gerenciamento de clientes. Dessa forma, nenhuma outra parte do sistema poderia acessar diretamente esses dados confidenciais.
O segundo desafio que contarei tem relação com a segurança nas transações financeiras, pois essa era uma prioridade máxima. Os desenvolvedores precisavam garantir que nenhuma classe externa ao módulo de pagamento pudesse interferir nessas transações, e diante disso, resolveram o problema usando o modificador de acesso "protected" para os métodos dessas transações. Isso permitiu que apenas as classes dentro do módulo de pagamento, bem como suas subclasses em outras partes do sistema, pudessem acessar esses métodos. Isso proporcionou uma camada adicional de segurança e evitou acesso não autorizado às transações financeiras.
Observe que com o uso correto dos modificadores de acesso para controlar a visibilidade e o acesso em seu sistema de comércio eletrônico, nesse caso apresentado, obteve-se um sistema seguro, extensível e altamente funcional, garantindo a confiança dos clientes e o sucesso contínuo do negócio.
Recordando um assunto já visto em lições passadas, você aprendeu que encapsulamento é um princípio central da programação orientada a objetos, que consiste no agrupamento de dados (atributos) e métodos que operam nesses dados em uma única unidade chamada classe.
Esse conceito permite controlar o acesso aos atributos, restringindo-o apenas aos métodos da classe, enquanto o restante do código externo à classe interage com esses atributos por meio de métodos públicos. Essa abordagem protege os dados, oculta a complexidade de implementação e promove a manutenção eficiente do código, contribuindo para a construção de sistemas mais robustos e organizados.
Esse pilar desempenha um papel fundamental na proteção dos dados e na ocultação de detalhes de implementação em POO - Programação Orientada a Objetos.
Hoje, temos os modificadores de acesso “public”, “private” e “protected” que desempenham um papel crucial na determinação de quem pode acessar os membros de uma classe (atributos e métodos) e até a própria classe, a partir de classes externas.
Conforme Deitel e Deitel (2016), os membros declarados como "public" têm como principal objetivo apresentar aos clientes da classe uma visão clara dos serviços que ela oferece, sendo acessíveis de qualquer lugar, tanto dentro da própria classe quanto de qualquer outra classe que tenha acesso a ela. Isso significa que eles têm o mais amplo escopo de visibilidade e podem ser acessados sem restrições. No entanto, isso também pode introduzir riscos de segurança se os dados forem manipulados de maneira inadequada.
Segundo Deitel e Deitel (2016) as variáveis (atributos) ou métodos declarados com o modificador de acesso “private” são acessíveis somente a métodos da classe em que isso ocorre. Isso fornece o mais alto nível de encapsulamento e proteção de dados, impedindo o acesso direto a esses membros a partir de outras classes. Normalmente, métodos públicos (getters e setters) são usados para permitir acesso controlado a esses membros, garantindo que as verificações adequadas sejam realizadas.
De acordo com Deitel e Deitel (2016), os membros declarados como "protected" em uma classe podem ser acessados por membros dessa superclasse, de suas subclasses e de outras classes no mesmo pacote. Isso é frequentemente usado para permitir que as subclasses acessem membros da classe pai, mantendo-os ocultos de outras classes fora da hierarquia de herança. Isso ajuda a estabelecer relações de herança e reutilização de código.
Os modificadores de acesso permitem controlar e restringir o acesso aos membros de uma classe com base em suas necessidades de visibilidade e proteção de dados. Eles desempenham um papel fundamental no encapsulamento, na organização do código e na criação de relações hierárquicas entre classes, garantindo que o acesso aos membros seja adequado e seguro.
Veja como é a aplicação do modificador “public” em uma classe, atributo e método Java. Para declarar uma classe como pública, você simplesmente coloca a palavra-chave “public” antes da declaração da classe como na Figura 01:
Para definir um atributo como público, você também usa o modificador “public” antes da declaração do atributo como na Figura 02:
Da mesma forma, para definir um método como público, você utiliza o modificador “public” antes da declaração do método como na Figura 03:
O modificador “private” é usado em Java para restringir o acesso a membros de uma classe, tornando-os visíveis somente dentro dessa classe. Vamos detalhar o uso desse modificador em classes, atributos e métodos.
Primeiramente, é importante ressaltar que não é possível declarar uma classe como "private" em Java. As classes são sempre públicas, o que significa que elas têm um grau mínimo de visibilidade. No entanto, para definir um atributo como privado, você usa o modificador “private” antes da declaração do atributo como apresentado no modificador anterior. Definir o atributo como privado significa que ele somente poderá ser acessado e modificado dentro da própria classe. Qualquer tentativa de acessá-lo de fora da classe resultará em um erro de compilação.
É aqui que entram os chamados getters e setters na Programação Orientada a Objetos (POO), pois, para acessar ou modificar esse atributo a partir de fora da classe, você geralmente fornece métodos públicos, como na Figura 4:
Quando definimos um método privado, utilizamos a mesma sintaxe apresentada na Figura 03, porém com o modificador “private” ao invés do modificador “public”. Além, é claro, de suas consequências, pois o método privado poderá ser chamado somente dentro da própria classe, uma vez que não está disponível para outras classes ou partes do projeto.
O uso do modificador “private” é fundamental para o encapsulamento de dados e a segurança do código, pois controla o acesso aos membros da classe, evitando modificações não autorizadas e protegendo a integridade dos dados.
O modificador “protected” permite que os membros de uma classe sejam acessados por subclasses e por outras classes no mesmo pacote. Por exemplo, você pode declarar uma classe com o modificador “protected”. Nesse caso, ela poderá ser acessada somente por subclasses da classe que a contém e por outras classes no mesmo pacote. O exemplo se iguala ao da Figura 01, substituindo o modificador “public” por “protected”.
Já para definir um atributo como protegido além da mesma “fórmula” vista nos exemplos de modificadores anteriores, você usa o modificador “protected” antes da declaração do atributo. Assim ele poderá ser acessado também por subclasses e por classes no mesmo pacote. Isso permite certa flexibilidade no acesso aos atributos, mas eles não são visíveis fora dessas condições.
Da mesma forma, para definir um método como protegido, use o modificador “protected” antes da declaração do método, semelhante a sintaxe da Figura 03 substituindo o tipo de modificador. Assim, o método protegido pode ser chamado também por subclasses e por classes no mesmo pacote, mas não estará disponível para classes fora dessas condições.
O modificador “protected” é útil quando você deseja permitir que subclasses acessem membros da superclasse, mas ainda deseja controlar o acesso a esses membros de classes fora do pacote. Isso é importante para manter o encapsulamento e a segurança do código, permitindo extensibilidade por meio de subclasses.
Um técnico em desenvolvimento de sistemas precisa entender sobre modificadores de acesso para garantir a segurança, a organização e a reutilização eficiente de código em um sistema de software. Esses modificadores controlam quem pode acessar os membros de uma classe, promovem o encapsulamento dos dados, facilitam a reutilização do código e tornam a manutenção do sistema mais simples. Sendo assim, o conhecimento sobre modificadores de acesso é fundamental para criar sistemas robustos e de fácil manutenção.
Mas, além de saber a importância desse conteúdo para sua vida profissional é preciso ver como isso funciona na prática, para que assim seja possível consolidar este conhecimento. Sendo assim, hoje você irá desenvolver uma implementação simples abordando os modificadores de acesso vistos durante a lição. Para isso, utilizaremos o ambiente de desenvolvimento onlinegdb.
Siga o passo a passo da implementação:
Abra seu navegador web e acesse o site OnlineGDB em https://www.onlinegdb.com.
Escolha a linguagem de programação que deseja usar. Selecione “Java” na lista suspensa.
Renomeie o arquivo Main.java para MinhaClasse.java.
No editor de código, você pode escrever o código Java com implementação de funções e procedimentos conforme a Figura 05.
Segue algumas explicações sobre o código da Figura 05:
Linhas 1 e 16: Declaração da classe MinhaClasse em Java com o uso de chaves para delimitar o início e o fim da classe.
Linhas 2 a 4: Declaração dos atributos (modificador de acesso, tipo e nome).
Linhas 6 a 8: Implementação de um método público.
Linhas 10 a 12: Implementação de um método privado.
Linhas 14 a 16: Implementação de um método protegido.
Linhas 18 a 22: Instanciação de uma instância da MinhaClasse e utilização do atributo público e método público.
Agora, você pode executar o código para testar a classe e ver como os atributos e métodos públicos funcionam, enquanto os atributos e métodos privados e protegidos não são acessíveis fora da classe. Essa prática demonstra como criar uma classe Java com diferentes modificadores de acesso. Agora o desafio está nas suas mãos. Que tal implementar algumas classes do case desta lição hein?
DEITEL, P.; DEITEL H. Java: Como programar. 10 ed. São Paulo: Ed. Pearson, 2016.