Olá pessoal,
Na Aula 04 - Equals e mais listas, parte 1, por volta de 09min15s, o instrutor implementa primeiramente o método "ehIgual", que recebe como parâmetro a referência a um objeto Conta (Conta outra). Minha dúvida está relacionada aos acessos aos atributos, como os que ele fez na comparação abaixo:
public boolean ehIgual(Conta outra) {
if (this.agencia != outra.agencia) {
return false;
}
if (this.numero != outra.numero) {
return false;
}
}
Notem que os acessos são feitos diretamente aos atributos do objeto outra (outra.agencia e outra.numero), recebido por referência no método. Quando é implementado o método equals, primeiramente é feito um typecast para a classe específica:
Conta outra = (Conta) ref;
E novamente o acesso é feito diretamente aos atributos, que são declarados como private nesta classe Conta. Entendo que trata-se de um objeto da classe Conta fazendo uma comparação com outro objeto da mesma classe, mas o fato do atributo ser private não deveria impedir este acesso direto, mesmo sendo objetos da mesma classe? Eu havia entendido que o acesso deveria ser feito exclusivamente pelos métodos, mesmo nestes casos.
O que me deixou ainda mais intrigado é o fato de que todos os atributos ficam expostos não só para leitura, mas também para escrita. Testei o seguinte código dentro do método equals():
@Override
public boolean equals(Object ref) {
Conta outra = (Conta) ref;
if (outra.saldo >= 0.01) {
outra.saldo -= 0.01;
this.saldo += 0.01;
}
if(this.agencia != outra.agencia) {
return false;
}
if(this.numero != outra.numero) {
return false;
}
return true;
}
E funcionou, o código permitiu "sacar" um centavo de qualquer conta que seja referenciada pelo equals sem utilizar os métodos saca e deposita, simplesmente manipulando o atributo saldo.
Enfim, é isso mesmo? Obrigado!