Monday, August 31, 2009

SCJP - 07 - Equals e Hashcode

É, eu sei, eu tenho estudado pouco para a certificação. E sei que isso mais cedo ou mais tarde vai dar merda... Comecei o capítulo 7 hoje, e nem sei quando eu vou terminar de lê-lo. Ando só lendo, nada de exercício, trabalho nao deixa, e chego meio cansado em casa... Bem, chega de mimimi e vamos ao que interessa.





Equals - Pra que?



Por que usar equals? Quando você não o sobrescreve, acaba usando a implementação da classe Object, onde equals() e == significam a mesma coisa. O operador == verifica se dois objetos são idênticos, ou seja, se duas variáveis de referência possuem a mesma sequência de bits, o que significa que referenciam o mesmo objeto em memória.



Um bom motivo para usar uma versão sobrescrita do método equals() é a necessidade de usar um Map no Java. Map é uma estrutura na qual você mapeia um valor do tipo V usando uma chave do tipo K. As chaves devem ser únicas no mapa. Você, invariavelmente, vai precisar instanciar um novo objeto do tipo K, usando certos dados significativos, para resgatar um valor do tipo V no Map. Se não implementar o método equals(), o objeto que foi usado como chave no Map nunca será igual ao que você acaba de instanciar.



Equals - Como?



Implementar o método equals() é relativamente simples, mas se faz necessário certos cuidados. Quando se usa a geração automática de código do Eclipse, algo parecido com o código abaixo é gerado:



public boolean equals(Object obj) {
if (this == obj)
return true;
if (!super.equals(obj))
return false;
if (getClass() != obj.getClass())
return false;

...
}


Primeiramente, se duas variáveis de referência referenciam o mesmo objeto, obviamente, elas possuem o mesmo conteúdo. Se a sua classe é derivada de outra, é prudente fazer um teste com o equals() da superclasse. Note também que a terceira condicional tem semântica semelhante ao instanceof.



Às reticências, seguiriam um cast para o tipo da classe, e a comparação, campo a campo, da chamada chave de negócio.



Chave de negócio, entre outras palavras, é um conjunto de campos que tornam um registro único em relação aos demais.


Para uma implementação "correta" do método equals, note o seguinte:



  • O método equals() é público, precisa receber um Object como parâmetro, e deve retornar um valor primitivo boolean.

  • Reflexão: Para todo objeto x, o teste x.equals(x) é verdadeiro.

  • Elemento Nulo: Para todo x, x.equals(null) é falso.

  • Transitividade: Para todo x, y, z, se x.equals(y) e y.equals(z), então x.equals(z).

  • Simetria: Para todo x e y, se x.equals(y), então y.equals(x).

  • Consistência: Obviamente, que para todo x e y, se nenhuma informação usada na comparação em ambas as variáveis de referência for modificada, múltiplas chamadas a x.equals(y) ou retornam true, ou retornam false.

Hashcode - Pra que?

Uma função hash é um procedimento bem definido ou função matemática que converte uma quantidade variável (possivelmente grande) de dados em um pequeno dado, muitas vezes um inteiro, usado como índice em tabelas. [Wikipedia]
As tais tabelas, citadas na definição acima traduzida livremente por mim, fazem referênia às tabelas de dispersão:
Em ciência da computação, uma tabela de dispersão (também conhecida por tabela de espalhamento ou tabela hash, do inglês hash) é uma estrutura de dados especial, que associa chaves de pesquisa a valores. Seu objetivo é, a partir de uma chave simples, fazer uma busca rápida e obter o valor desejado. [Wikipedia]
Em java, estruturas como HashMap, HashSet e outras, usam o hashcode para definir onde um registro será armazenado, de forma que, também usando o hashcode, este registro seja resgatado com custo O(1) no melhor caso (complexidade de algoritmos). Para se resgatar um registro, usa-se normalmente o hashcode() para saber em quais posições da estrutura de dados procurar, e o método equals() para verificar se aquele é o registro procurado. Por isso, costuma-se dizer que, para manter a lógica da aplicação, equals() e hashcode() devem usar a mesma chave de negócio. Além disso, se dois objetos podem cair numa mesma posição da estrutura de dados, usando o hashcode() como meio de endereçamento, isso significa que existem x e y para os quais hashcode(x) = hashcode(y), o que costuma-se chamar de colisão.

Hashcode - Como?

Existem muitas formas de implementar uma funçao hashcode, como também descrito aqui, mas vamos dar uma olhada naquela que o Eclipse nos fornece, automaticamente:
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result
+ ((campoX == null) ? 0 : campoX.hashCode());

... // para outros campos, siga como acima.
return result;
}
É possível perceber que, ao final, é feita uma multiplicação como a seguinte:
hash(A1,...,An) = n * hash(A1,...,An-1) + hash(An)
Onde n é um número primo.
Isso porque a escolha de n influencia o espalhamento dos registros, e números primos tendem a distribuir os restos da divisão de maneira mais uniforme que os não primos. [Hashing. Pimente, Graça & Cristina, Maria. ICMC]
Obs.: Não tomem essa função como 100% correta :P Assim como a implementação do equals() segue um certo contrato, também o é com a implementação do hashcode().
  • Sempre que invocado no mesmo objeto mais de uma vez durante a execução de uma aplicação Java, o método hashcode() precisa retornar o mesmo resultado, se nenhuma informação usada pelo método equals() for alterada. O método hashcode() não precisa manter a consistência do resultado de uma execução da aplicação para outra.

  • Para todo x,y, se x.equals(y) == true, então hashcode(x) == hashcode(y). Pela lei da contraposição, para os mesmos x,y, se hashcode(x) != hashcode(y), então x.equals(y) == false.

  • Não é necessário que dois objetos com o mesmo hashcode() sejam iguais, pelo método equals().

Acho que falei demais, né? :P Espero que tenha ficado o mais claro e resumido possível. Aparentemente, quando se pensa em equals() e hashcode(), não se imagina quanta coisinha de lógica e regras tem nos bastidores... E, pra variar, no caso de usar campos de data no hashcode, sugiro que você dê uma olhada nisso.

Creative Commons License Esta obra está licenciada sob uma Licença Creative Commons.

Sunday, August 23, 2009

Coisas para se fazer ao sair de um motel



  • Saia apertando todas as campainhas de todos os quartos

  • Pague o período inteiro com moedas de R$0,01

  • Berre pelo corredor em alto e bom som: desculpe incomodar o silêncio da trepada de vocês, eu venho aqui trazendo o delicioso mendorato na promoção, 3 por R$1,00...

  • Bata insistentemente na porta de um dos quartos, aos berros, falando que o tempo acabou



Quem sugere mais coisa? :P





Creative Commons License

Esta obra está licenciada sob uma Licença Creative Commons.

Wednesday, August 19, 2009

Saber sair do emprego: eis a questão.

Ouvi, certa feita, que os jovens tem a ansiedade dentro do sangue. A sede de contestar valores, de expressar insatisfação, a pressa para ocupar e conquistar um espaço, em qualquer lugar que seja. Isso não exclui o mercado de trabalho.





A primeira assinatura na nossa carteira de trabalho é comemorada como um campeonato brasileiro da vida. E o primeiro salário vai embora mais rápido que aquela loira gostosa do bar, quando chegamos junto com cara de peixe morto. O tempo vai passando, e a gente vai ganhando experiência, vai ouvindo conversas aqui e ali, nos corredores, aprendendo com os nossos erros e com os erros alheios.



Entretanto, em algumas ocasiões, as coisas mudam. Surgem novas oportunidades, ou simplesmente a espectativa de crescimento dentro da empresa não nos agrada. Às vezes, não nos sentimos tão confortáveis com algo estático. Há ainda, aquelas ocasiões em que saímos de uma empresa por não aguentar mais um chefe, um colega de trabalho... E ai?



Foi lendo que eu aprendi grande parte do que eu sei hoje (inclusive, sobre sexo). E foi lendo que eu encontrei este artigo, no Produzindo.net:



Não se precipite. Mantenha a calma. A menos que algo terrível tenha acontecido, esta decisão não precisa (e não deve) ser tomada do dia para a noite. Se você pedir as contas por uma simples discussão ou um resultado ruim, não será encarado com bons olhos por chefes nem colegas. Isto pode dificultar muito na hora de conseguir um novo emprego.


Leiam o artigo, realmente vale muito a pena.







Creative Commons License

Esta obra está licenciada sob uma Licença Creative Commons.

Friday, August 14, 2009

Calcule sua recisão contratual

Ainda não achei o que eu queria, uma calculadora de salário líquido decente. Todas as que eu vi tinham uma certa variação nos resultados, dando o mesmo valor como entada. Mas... Acabei achando um site onde você pode ter uma noção do quanto ganhará se pedisse demissão hoje.



Eu estou falando do site cálculo exato. Fui lá na parte trabalhista e escolhi calcular uma possível recisão por pedido de demissão. Dá pra rir um pouco :D Bem, isso pode ser útil mais tarde, então, estou postando aqui pra referências futuras :)



Creative Commons License

Esta obra está licenciada sob uma Licença Creative Commons.

Saturday, August 8, 2009

E o seu relacionamento, como vai?

Como não podia deixar de ser, Fausto, o Mestre dos Magos, vai e resolve citar um vídeo do youtube, um programa com toda aquela cara sensacionalista que nós vemos por ai. Mas o interessante foi o episódio em questão, que me fez baixar a sequência de 6 partes aqui pro meu pc.



Uma mulher, que informam ter 19 anos, vai até o programa em questão fazer o tal Teste de Fidelidade. O namorado dela, um cara extremamente culto, do ramo das artes, vai fazer uma entrevista de emprego para um antiquário, entrevista esta totalmente armada pelo programa. A dona do antiquário, atriz do programa (Márcia Imperator, quem não conhece?), tenta seduzí-lo, para testar a fidelidade dele à namorada.







O engraçado é o modo como ele fala da namorada dele. O modo como ele se posiciona dentro do próprio relacionamento. O sistema de pesos e medidas que ele adota, até chegar ao climax deste episódio, que aparentemente fez o youtube pedir confirmação de data de nascimento :D



Update - Segue o link dos demais episódios:



Parte 01 - http://www.youtube.com/watch?v=nM5B-8-3kyo

Parte 02 - http://www.youtube.com/watch?v=9oKmU_Chfto

Parte 03 - http://www.youtube.com/watch?v=smBbtT5eznA

Parte 04 - http://www.youtube.com/watch?v=KDd4AQEdzPM

Parte 05 - http://www.youtube.com/watch?v=h6WWTrxGMXc

Parte 06 - http://www.youtube.com/watch?v=Dy65CNjJO1A



Dica pra quem quiser baixar estes episódios pro computador: instala o vdownloader.



Creative Commons License

Esta obra está licenciada sob uma Licença Creative Commons.

Tuesday, August 4, 2009

Escrever bem pode salvar o seu emprego

Tem gente que me sacaneia porque eu sou um pseudo-nerd e tenho um blog que não é totalmente voltado pra questões tecnológicas. Aqui tem poesia, tem música, tem desabafos, e muitas outras coisas. Eu já desconfiava que escrever, tocar um instrumento, ou os famosos happy hour às sextas feiras são maneiras de aliviar o stress nessa que é uma das, senão a maior, estressantes áreas.



Até o momento em que eu paro o que estou fazendo (entre casos de uso e e-books) para a leitura periódica dos meus feeds. E lá estava um post do Vinícius, do Carreira e Certificações em TI. Eu não sabia que escrever poderia salvar o meu emprego :) Pelo que o artigo relata, escrever traz equilíbrio emocional, que se reflete em maior segurança durante as entrevistas de emprego:



Após três meses do estudo realizado, 27% dos participantes do grupo que escreveu conseguiram um novo emprego, enquanto somente 5% das pessoas dos outros dois grupos obtiveram sucesso. Nos meses seguintes, 53% dos “escritores” já estavam empregados, contra somente 18% dos demais grupos.


Então, eu acho que preciso escrever mais um pouco :) Quem sabe eu não vire um GP só escrevendo? Não, senhores, GP (Gerente de Projeto) nada tem a ver com garoto de programa.



Creative Commons License

Esta obra está licenciada sob uma Licença Creative Commons.

Saturday, August 1, 2009

[EricEvans] Domain Driven Design - DDD

Estava eu matando a curiosidade sobre o termo, que ao pé da letra significa Projeto Orientado a Domínio. Estava também procurando o livro do Eric Evans sobre o assunto, mas acabei encontrando esse post do Guilherme Chapiewski: Síndrome de DAO.



Logo abaixo desse mesmo post, uma crítica a mim mesmo: Você tem que ler os livros! Bem, e que livros seriam esses? E lá vai eu dar aquela pesquisada de novo. Tem a comunidade do Domain Driven Design na internet. Achei que lá seria o melhor ponto de partida para saber quais livros eu teria que ler. Então, eu acho que vou começar pelo Domain Driven Design Quickly, isso é, se o volume de coisas que me mandam fazer no trabalho diminuir um pouco (ainda nem terminei o SCJP 6 Book) :D



Fuçando mais um pouco, eu achei um link de uma aplicação de exemplo da aplicação da DDD. Ainda não tive tempo de olhar, mas deixo aqui pra referências futuras :D



Creative Commons License

Esta obra está licenciada sob uma Licença Creative Commons.