Olá Walter, tudo bem com você?
Então, você pegou uma parte da ideia, só vou dar uma breve explicação, ok?
O nosso exercício básico começa da seguinte maneira:
Endereço na Memória: #200
----------Conta1----------
| - numero: 200 |
| - nome: "Junior |
----------------------------
Endereço na Memória: #400
----------Conta2----------
| - numero: 200 |
| - nome: "Junior |
----------------------------
Bem o nosso exemplo começa assim e se pedirmos o hashcode de ambos teremos algo como:
- 32131232321
- 11999999999
Como esperado, são diferentes, ainda que tenham os mesmos dados, pois são 2 objetos diferentes,
Para melhorar nosso exemplo, o dart
tem uma função que se chama identical(x, y)
que nos retorna verdadeiro / falso se 2 objetos são a mesma coisa, no caso:
identical(conta1, conta2)
>> false
`
Aqui eu vou fazer apenas um pequeno comentário, que acredito que não é abordado no curso, não precisamos fazer conta1 = conta2
para que eles tenham o mesmo hashcode
na verdade, podemos definir como esse hashcode é gerado da seguinte maneira:
- Iremos sobreescrever o método hashcode dentro de nossa classe, por exemplo
class Conta {
String _nome;
int _numero;
Conta(this._nome, this._numero);
String get nome => _nome;
int get hashCode => _nome.hashCode;
}
Se fizermos print(conta1.hashCode)
e print(conta2.hashCode)
teremos o seguinte resultado:
317994031
317994031
Então agora o número que é gerado é baseado no nome
, e se clientes tiverem mesmo nome
o hashcode de ambos serão iguais :)
Novamente podemos utilizar aquela função:
identical(conta1, conta2)
>> false
Porque agora mesmo eles tendo o mesmo hashcode
continuam sendo falso? Porque neste caso temos 2 objetos iguais, mas com endereços de memória diferente, como desenhei no primeiro quadrinho
Agora irei fazer:
conta1 = conta2
identical(conta1, conta2);
>> true
E agora quando eu faço esse merge
tenho que são iguais, mas por que?
Porque eu não copiei os dados, eu estou falando:
"Olha, a minha variável conta1 agora se refere ao mesmo endereço da memória de conta2"
mas aí quando eu dou o conta1 = conta2 eu faço uma cópia identica, inclusive de "ID".
Aqui podemos provar que não é uma cópia da seguinte maneira:
conta1.nome = "Carlos"
print(conta1.nome)
print(conta2.nome)
>> Carlos
>> Carlos
Bem, se fosse uma cópia, era apenas para trocar o de conta1, dado que já copiamos todas as informações, então na verdade o que acontece é que estamos pegando sempre os mesmos endereços de memória, e isso é o chamado referencia
Então agora conta1
e conta2
se referem a mesma coisa
O que faz eu ser capaz de printar o HashCode tanto pra uma variável quanto pra outra? Após o "merge", ao "sumir uma conta" não deveria dar erro em um dos prints?
Então, as variáveis não somem, o que some na verdade é isso aqui:
Endereco de Memoria: 200
----------Conta1----------
| - numero: 200 |
| - nome: "Junior |
----------------------------
Todas as informações que estavam antes em Conta1
são perdidas pois é como disséssemos: "Pare de referenciar o endereço 200 e agora você irá referenciar 400", dessa forma não temos mais acesos ao que estava dentro do endereço 200 da memória :)
Compreende?
Agora se pararmos de utilizar classes e mudar para coisas do tipo int
teremos algo diferente:
int num1 = 5;
int num2 = 8;
num1 = num2;
print(num1);
>> 8
print(num2);
>> 8
num1 = 9;
print(num1);
>> 9
print(num2);
>> 8
Isso ocorre porque int
, bool
, double
, String
não iremos passar a referência ( endereço da memória), e essa sim, iremos copiar o valor para nova variável
Qualquer Coisa estou à disposição :)
Abraços e Bons Estudos!