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!