1
resposta

Controle de senha

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

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

    public void setSenha(String senhaAntiga, String senhaAtual) {
        if (this.senha.equals(senhaAntiga) ) {
            System.out.println("Senha alterada com sucesso!");
            this.senha = senhaAtual;
        } else {
            System.out.println("Senha atual incorreta. A senha não foi alterada");
        }
    }
}
public class Exercicios {
    public static void main(String[] args) {
      Usuario usuario1 = new Usuario("Bernardo", "12345678");
      usuario1.setSenha("12345678", "123456789");
    }
}
1 resposta

Olá, Bernardo. Como vai?

Excelente código! A sua lógica para a validação da troca de senhas está impecável. Você utilizou o método .equals() corretamente para comparar as Strings e seguiu à risca as boas práticas de encapsulamento ao definir os atributos nome e senha como private.

A estrutura do seu método setSenha ficou muito interessante porque ela foge daquele modelo tradicional que apenas altera o valor sem conferir nada. Você adicionou uma camada de inteligência e segurança ao exigir a confirmação da senha antiga.

Para enriquecer ainda mais o seu aprendizado e trazer boas práticas adotadas no mercado de desenvolvimento Java, deixo três sugestões importantes:

1. Nomenclatura dos Parâmetros

A assinatura do seu método está assim: setSenha(String senhaAntiga, String senhaAtual). Pensando no fluxo da ação, o usuário está enviando a senha que ele usa hoje para tentar cadastrar uma nova senha.

Para deixar a leitura do código mais natural e intuitiva para outros desenvolvedores, uma convenção muito usada é renomear os parâmetros para senhaAntiga e novaSenha (ou senhaAtual e novaSenha). Veja como fica mais legível:

public void setSenha(String senhaInformada, String novaSenha) {
    if (this.senha.equals(senhaInformada)) {
        System.out.println("Senha alterada com sucesso!");
        this.senha = novaSenha;
    } else {
        System.out.println("Senha incorreta. A senha não foi alterada.");
    }
}

2. Validação de Força da Senha (Regra de Negócio)

Uma grande vantagem de encapsular o acesso à senha dentro de um método é que podemos criar validações antes de aceitar o novo valor. Por exemplo, você pode impedir que o usuário cadastre uma senha vazia ou curta demais.

Podemos expandir a sua lógica adicionando uma verificação de tamanho mínimo:

public void setSenha(String senhaInformada, String novaSenha) {
    if (!this.senha.equals(senhaInformada)) {
        System.out.println("Senha incorreta. A senha não foi alterada.");
        return; // Interrompe a execução do método
    }

    if (novaSenha == null || novaSenha.length() < 8) {
        System.out.println("Erro: A nova senha deve ter pelo menos 8 caracteres.");
        return;
    }

    this.senha = novaSenha;
    System.out.println("Senha alterada com sucesso!");
}

3. Evite expor a senha em métodos getter

Como estamos lidando com um atributo crítico de segurança, uma boa prática de encapsulamento para a classe Usuario é nunca criar um método getSenha(). Se outras partes do sistema precisarem checar se a senha está correta (como em uma tela de login), em vez de entregar a senha para fora, a própria classe deve fazer a checagem por meio de um método de validação, mantendo o segredo trancado dentro do objeto:

// Em vez de um getSenha(), use um método de autenticação
public boolean autenticar(String senhaInformada) {
    return this.senha.equals(senhaInformada);
}

Parabéns pelo projeto! O caminho para dominar a Orientação a Objetos é exatamente esse: construir classes conscientes e que protegem suas próprias informações.

Espero que possa ter lhe ajudado!