Tava escrevendo um programinha aqui e em um determinado momento eu pensei em salvar algumas linhas usando o switch, mas ai lembrei que ele não suporta a comparação nem com Strings nem c/ Objectos… parece que só com char, int, float etc…
só que fiquei na dúvida do pq não seria possível a utilização dele com objetos e fui pesquisar… encontrei esse link: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5012262 que parece explicar o porque… mas confesso que continuei sem entender, se alguém souber e poder dar uma palavrinha acerca disso eu agradeço… pensei até em usar como mencionado no Link, c/ hashCode, mas imaginei que o código ficaria deselegante e terminei optando pelos ifs e elses… não sei de qual modo ficaria pior :(!
Pq nao usar polimorfismo pra fazer o mesmo tipo de coisa?
T
thingol
Duas strings diferentes podem ter o mesmo hashCode. Portanto não use hashCode para fazer esse tipo de comparação.
tiagomac
Então, bom saber que 2 Strings podem ter o mesmo hashCode, terei mais cuidado com isso na próxima vez…
meu problema é que eu desenvolvi uma classe ActionListener onde eu quero que todos os botões da interface visual cheguem nessa mesma classe, no mesmo actionPeformed… no momento a única saída que encontrei foi utilizar os ifs e else mesmo, que achei que ficaram um tanto bagunçado (if (e.getSource == botaoX))… enfim. Polimorfia teria como se encaixaria nessa situação?
tem algum jeito mais elegante de fazer isso? o Visual Editor criaria uma classe para cada botão, não é bem isso que eu quero…
T
thingol
Duas strings diferentes podem ter o mesmo hashCode. Portanto não use hashCode para fazer esse tipo de comparação.
Exemplos:
hashCode = -644512679: as strings “desprezível” e “auréola” têm esse mesmo hashCode.
2464: “N.”, “Ll”, “MM”
110990: “pig”, “peã”, “discóbolo”
3143404: “fixa”, “inflamabilidade”
97793703: “fungo”, “fujão”
103156083: “longo”, “lojão”
Dieval_Guizelini
Eu normalmente utilizo os if aninhados, mas recorro au getActionCommand() do objeto EventList para deixar os texts e nome de objetos independentes da ação.
E faço invertido para não ter que verificar o nulo:
if("acao".equals(evt.getActionCommand()))...
fw
Sami_Koivu
Legal, thingol. Fiquei curioso: Como é que você fez para achar essas “colisões”?
sergiolopes
tbm fiquei curioso
pcalcado
tiagomac:
Polimorfia teria como se encaixaria nessa situação?
tem algum jeito mais elegante de fazer isso? o Visual Editor criaria uma classe para cada botão, não é bem isso que eu quero…
Polimorfismo é exatamente o que um programa OO (seja em uma linguagem OO como Java ou não - por isso nem todo programa Java é OO) usa no lugar de switches. O que o editor que citaste faz é exatamente o que você precisa (numa linguagem sem blocos), verifique o padrão de projeto command e o que são classes anônimas.
T
thingol
Sami Koivu:
thingol:
Exemplos…
Legal, thingol. Fiquei curioso: Como é que você fez para achar essas “colisões”?
Sami, parabéns pelo campeonato de Fórmula 1 conquistado pelo seu conterrâneo (Kimi Räikönnen).
Ahh, legal.
Valeu O Kimi ficou campeão com a ajuda do Massa.
tiagomac
Vlw mesmo pessoal, bem produtiva a discussão… eu só fiquei chateado em saber q 2 strings podem ter o mesmo hashcode :(! pensei que hashcode fosse um valor individual… só por curiosidade, isso vale também para outros objetos além de Strings? 2 Objetos “Pessoa” podem ter o mesmo hash :O?
T
thingol
Podem, pelo princípio da contagem (o hashCode pode assumir valores de -[telefone removido] a +[telefone removido] mas você sabe que uma instância de Pessoa pode assumir muitos mais valores porque ela contém pelo menos uma String, e como você sabe, os hashCodes de strings podem se repetir).
J2Alex
Imagine o hashcode como um container. Cada hashcode é um container que pode conter objetos diferentes… Sets e Maps utilizam o hashcode para localizar objetos em um determinado container e usam equals para localizar um determinado objeto dentro desse determinado container. Isso ajuda agilizar a busca em grandes coleções.
Quanto menos objetos possuirem o mesmo hashcode, mais eficiente será a busca.
Marky.Vasconcelos
Falando em hashCode
As minhas classes são na maioria entidades e tem um atributo id.
Seria mal sobreescrever hashCode e retornar apenas o valor de id?
PS: Eu já faço isso.
T
thingol
Se o id for único e couber em um int não tem problema nenhum.
Se ele couber em um long, também não tem problemas (acho que você não vai ter mais de 2 bilhões de entidades )
Marky.Vasconcelos
2 Bilhões não,
mas tenho
900 mil.
Então acho melhor usar com o id porque se for multiplicar provavelmente conseguirei um int maior que o maximo.