Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

O "merge" das contas 1 e 2 realmente fazem sumir a conta 1?

Bom dia, Timoteo. Tenho uma dúvida sobre a atribuição dos atributos dos objetos :

conta1 = conta2;

Você diz no vídeo que a conta1 e conta2 agora são uma conta só após atribuir uma à outra. Que faz ela receber um só "identificador" (hashcode). Certo?

Si agora elas são uma só. 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?

A impressão que eu tive é que na real, as duas existem na memória como variáveis identicas que recebem nomes diferentes. Tipo, ele passa o código inteiro como coisas diferentes, mas aí quando eu dou o conta1 = conta2 eu faço uma cópia identica, inclusive de "ID".

Valeu!

1 resposta
solução!

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!