1
resposta

Erro de senha

Coloquei um valor no meu atributo senha para cada classe que tinha como interface implementada "Autenticavel", porem, quando utilizo o metodo autentica com a senha correspondente ao atributo, ele nao devolve como verdadeiro. Eu nao sei como resolver.

public class Program {

    public static void main(String[] args) {

        Cliente cliente = new Cliente();
        cliente.setSenha(1111);
        Gerente gerente = new Gerente();
        gerente.setSenha(2222);
        Administrador adm = new Administrador();
        adm.setSenha(3333);

        SistemaInterno si = new SistemaInterno();
        si.autentica(cliente);
        si.autentica(gerente);
        si.autentica(adm);
    }

}
public class Cliente implements Autenticavel{
    private int senha = 1111;

    @Override
    public void setSenha(int senha) {
        this.senha = senha;
    }

    @Override
    public boolean autentica(int senha) {
        if(this.senha == senha) {
            System.out.println("Cliente: " + true);
            return true;
        }else {
            return false;
        }
    }
}
public class Gerente extends Funcionario implements Autenticavel{
    private int senha = 2222;

    @Override
    public double getBonificacao() {
        return super.getSalario();
    }

    @Override
    public void setSenha(int senha) {
        this.senha = senha;
    }

    @Override
    public boolean autentica(int senha) {
        if(this.senha == senha) {
            System.out.println("Gerente: " + true);
            return true;
        }else {
            return false;
        }
    }
}
public class Administrador extends Funcionario implements Autenticavel{
    private int senha = 3333;

    @Override
    public double getBonificacao() {
        return 50;
    }

    @Override
    public void setSenha(int senha) {
        this.senha = senha;
    }

    @Override
    public boolean autentica(int senha) {
            if(this.senha == senha) {
                System.out.println("ADM: " + true);
                return true;
            }else {
                return false;
            }
    }

}
public class SistemaInterno {

    private int senha = 2222;

    public void autentica(Autenticavel g) {
        boolean autenticou = g.autentica(this.senha);
        if(autenticou) {
            System.out.println("Login efetuado");
        }else {
            System.out.println("Login nao efetuado");
        }
    }
}
public abstract interface Autenticavel{

    public abstract void setSenha(int senha);
    public abstract boolean autentica(int senha);
}

saída no console: Insira aqui a descrição dessa imagem para ajudar na acessibilidade

1 resposta

Fala Carlos, tudo certo?

Esse comportamento ocorre pois na classe SistemaInterno:

public class SistemaInterno {

    private int senha = 2222;

    public void autentica(Autenticavel g) {
        boolean autenticou = g.autentica(this.senha);
        if(autenticou) {
            System.out.println("Login efetuado");
        }else {
            System.out.println("Login nao efetuado");
        }
    }
}

É guardada a informação de que a senha do sistema é 2222. Dentro dessa classe, o método autentica() tem o seguinte comportamento:

  • Recebe um autenticável.
  • Tenta autenticar o autenticável com a senha do SistemaInterno (2222)
  • Caso a senha seja a mesma, devolve true
  • Caso contrário, devolve false.

Como a senha do SistemaInterno é 2222, e a do Gerente também, o comportamento do código é devolver verdadeiro. No entanto, como a senha das classes Cliente e Administrador são diferentes da senha no sistema interno, o código retorna false.

Para resolver isso, você pode alterar a assinatura do método autentica() da classe SistemaInterno para receber uma senha de autenticação.

public boolean autentica(Autenticavel autenticavel, int senha);

Assim, usar a senha fornecida para o método! Existem diversas maneiras de resolver esse mesmo problema, fique à vontade para explorar outras!

Em caso de dúvidas, fico à disposição.

Um grande abraço e bons estudos!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software