Pq o "Switch" não suporta Strings e objetos?

Olá pessoal,

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 :(!

Abraços!

Pq nao usar polimorfismo pra fazer o mesmo tipo de coisa?

Duas strings diferentes podem ter o mesmo hashCode. Portanto não use hashCode para fazer esse tipo de comparação.

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…

Duas strings diferentes podem ter o mesmo hashCode. Portanto não use hashCode para fazer esse tipo de comparação.
[/quote]

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”

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

Legal, thingol. Fiquei curioso: Como é que você fez para achar essas “colisões”?

tbm fiquei curioso :slight_smile:

[quote=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…
[/quote]

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.

[quote=Sami Koivu][quote=thingol]
Exemplos…
[/quote]

Legal, thingol. Fiquei curioso: Como é que você fez para achar essas “colisões”?[/quote]

Pelo método da força bruta - peguei uma lista de palavras encontradas em vários textos em http://acdc.linguateca.pt/acesso/ordenador.html (não é a lista do dicionário ispell, encontrada em http://www.ime.usp.br/~ueda/br.ispell/ ).

Sami, parabéns pelo campeonato de Fórmula 1 conquistado pelo seu conterrâneo (Kimi Räikönnen).

[quote=thingol]Pelo método da força bruta - peguei uma lista de palavras encontradas em vários textos em http://acdc.linguateca.pt/acesso/ordenador.html (não é a lista do dicionário ispell, encontrada em http://www.ime.usp.br/~ueda/br.ispell/ ).

Sami, parabéns pelo campeonato de Fórmula 1 conquistado pelo seu conterrâneo (Kimi Räikönnen). [/quote]

Ahh, legal.

Valeu :slight_smile: O Kimi ficou campeão com a ajuda do Massa. :slight_smile:

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?

Podem, pelo princípio da contagem (o hashCode pode assumir valores de -2147483648 a +2147483647 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).

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.

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.

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 :stuck_out_tongue: )

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.