Black November

ATÉ 50% OFF

TÁ ACABANDO!

0 dias

0 horas

0 min

0 seg

3
respostas

[Dúvida] Visualizando características privadas

Estava assistindo ao módulo “Visualizando características privadas” e surgiu uma dúvida sobre o uso de getters e modificadores de acesso. Entendo que eles servem para encapsular informações, controlando não apenas a leitura, mas também a escrita dos atributos.

No entanto, fiquei pensando em como isso se aplica em um cenário real, onde precisamos proteger certos atributos e métodos.
Por exemplo: em uma aplicação que possui login e controle de acesso, como fica a implementação quando uma classe ou método precisa ser chamado constantemente em diferentes partes do sistema?
Algo como: login → acesso a um módulo da aplicação → verificação se o usuário está logado e se possui permissão (usuário comum, administrador ou assinante).

Matricule-se agora e aproveite até 50% OFF

O maior desconto do ano para você evoluir com a maior escola de tecnologia

QUERO APROVEITAR
3 respostas

Oi Matheus! Como vai?

A ideia principal do encapsulamento é proteger os dados e garantir que eles sejam acessados e modificados de forma controlada, o que é crucial em aplicações que lidam com informações sensíveis.

Vamos considerar o exemplo de um sistema de login. Nesse caso, você pode ter uma classe Usuario com atributos privados como nome, senha e nivelDeAcesso. Para acessar ou modificar esses atributos, você utilizaria métodos getters e setters. No entanto, para a senha, você provavelmente não teria um getter, mas sim um método para verificar se a senha fornecida está correta.

Aqui está um exemplo simplificado:

public class Usuario {
    private String nome;
    private String senha;
    private String nivelDeAcesso;

    public Usuario(String nome, String senha, String nivelDeAcesso) {
        this.nome = nome;
        this.senha = senha;
        this.nivelDeAcesso = nivelDeAcesso;
    }

    public String getNome() {
        return nome;
    }

    public boolean verificaSenha(String senha) {
        return this.senha.equals(senha);
    }

    public String getNivelDeAcesso() {
        return nivelDeAcesso;
    }
}

No exemplo acima, a senha é verificada através de um método específico (verificaSenha), garantindo que o valor da senha nunca seja exposto diretamente. Isso é importante para a segurança dos dados.

Quando você precisa verificar se um usuário está logado e tem permissão para acessar um módulo específico, você pode criar um método que utilize esses getters e verificações. Por exemplo:

public boolean podeAcessarModulo(String modulo) {
    if (!verificaSenha(senhaInformada)) {
        return false;
    }
    // Lógica para verificar se o nível de acesso permite acessar o módulo
    return nivelDeAcesso.equals("administrador") || moduloPermitidoParaNivel(nivelDeAcesso, modulo);
}

Esse método poderia ser chamado em diferentes partes do sistema para garantir que o usuário tem as permissões necessárias antes de acessar certos recursos.

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.

Caramba, eu não tinha noção dessa lógica por trás da verificação de uma senha, mesmo que de forma simplificada. Fiquei pensando: será que eu preciso usar um getter para verificar a senha? Mas depois percebi que não, porque isso acabaria expondo a senha dentro da aplicação. Imagino que existam outras formas seguras de fazer essa verificação.
Outra dúvida que me surgiu: eu sei que a classe Main é responsável por executar a aplicação, mas quando precisamos criar novos objetos ou métodos, como isso é feito na prática?

Oi, Matheus!

Quando você pergunta como criar novos objetos ou métodos na prática, a ideia é que a classe Main apenas inicie o programa — ou seja, ela coordena a execução, mas não concentra toda a lógica. O ideal é que cada classe tenha sua própria responsabilidade, e a Main apenas utilize essas classes.

Veja este exemplo com base no cenário do sistema de login:


public class Usuario {
    private String nome;
    private String senha;
    private String nivelDeAcesso;

    public Usuario(String nome, String senha, String nivelDeAcesso) {
        this.nome = nome;
        this.senha = senha;
        this.nivelDeAcesso = nivelDeAcesso;
    }

    public String getNome() {
        return nome;
    }

    public boolean verificaSenha(String senha) {
        return this.senha.equals(senha);
    }

    public String getNivelDeAcesso() {
        return nivelDeAcesso;
    }
}

E na classe Main, você apenas cria o objeto e chama os métodos necessários:


public class Main {
    public static void main(String[] args) {
        Usuario usuario = new Usuario("Matheus", "1234", "administrador");

        if (usuario.verificaSenha("1234")) {
            System.out.println("Login realizado com sucesso!");
            System.out.println("Bem-vindo, " + usuario.getNome());
        } else {
            System.out.println("Senha incorreta!");
        }
    }
}

Perceba que a Main apenas instancia o objeto e usa os métodos públicos definidos na classe Usuario.
Se você precisar adicionar novas funcionalidades — como verificar permissões ou registrar ações —, o ideal é criar novas classes com responsabilidades específicas (por exemplo, Autenticador, GerenciadorDePermissoes, etc.), e a Main apenas coordena a execução delas.

Mas não se preocupe com todo um processo longo como esse, quando você for utilizar frameworks, você verá a facilidade de conexão de várias classe com a principal, principalmente se estivermos falando do Spring Boot, que é um anjo na terra.

Fico à disposição.