Quando eu estava começando a programar em Java, o fato de que as instruções do switch não usavam strings me frustrou. Então, ao usar o Enums, percebi os benefícios que você obtém com eles, em vez de transmitir valores brutos - segurança do tipo (que facilita a refatoração) e clareza para outros desenvolvedores.
Estou lutando para pensar em uma situação em que, com o SE7, agora decidirei usar um switch com strings como entradas, em vez de Enums. Se eles são implementados através da alternância de cadeias inteiras (por exemplo, em vez de correspondências parciais ou regex), não parece oferecer menos motivos para a alteração do código.
E com as ferramentas IDE e a taxa de leitura / gravação da codificação, eu ficaria muito mais feliz ao gerar um Enum extra do que passar valores de string.
Que benefício eles trazem para nós como programadores? Menos caldeira?
Não parece que o idioma estava clamando por esse recurso. Embora talvez haja um caso de uso que estou ignorando.
fonte
Respostas:
Tanto quanto posso dizer, a questão é por que o agrupamento de constantes String em enum não foi considerado suficiente para atender às necessidades dos usuários de idiomas. Isso foi abordado na proposta de recurso oficial anunciada na lista de discussão JDK 7 (project Coin).
De acordo com minha leitura da proposta, a alternativa de usar enumerações foi descartada pelo fato de introduzir tipos de inchaço. Para sua conveniência, parte relevante da proposta é citada abaixo, com a declaração endereçando enumerações em negrito :
fonte
Além de tornar o código mais legível, há potenciais ganhos de desempenho em relação às
if/else if
comparações. Se a mudança vale a pena depende de quantas comparações você faria. Uma chave de seqüência será emitida como duas instruções de chave separadas. O primeiro opera com códigos de hash, então tende a ser umlookupswitch
, gerandoO(log n)
complexidade. O segundo é sempre perfeitoO(1)
tableswitch
, então a complexidade combinada é quietaO(log n)
. Uma cadeia deif/else if
declarações única e linear daria umaO(n)
complexidade um pouco pior .Se você estiver comparando mais do que, digamos, três strings, então a
switch
é provavelmente mais legível e compacto. Provavelmente, terá um desempenho melhor, embora você não note uma diferença, a menos que esteja fazendo um grande número de comparações em um caminho de código ativo.fonte
if/else
prática ruim de grandes blocos, mas, no momento, não teria muitos motivos para usá-la.A troca de strings pode ser usada quando seus
enum
valores vêm de fora, ou seja, armazenados em um banco de dados.Outra coisa notável no JDK 7
switch
é que é muito mais perfomanto queif-else
construções.E um bom caso de uso para sequências rápidas
switch
es poderia ser a análise de fluxo JSON / XML quando você precisar fazer várias alternâncias nos tipos de nó e atributo. Não consigo pensar em nenhuma opção melhor para isso.fonte
enum
s pode ser usado neste caso devido à natureza estática do Java. Quando eu estava escrevendo isso, estava pensando em umRole
de uma biblioteca de segurança que geralmente é fornecida como uma classe e não pode ser inseridaenum
. Outro caso é um código Java / Groovy compilado dinamicamente - nessa situação, que é rara, as alternâncias de string podem ser uma opção melhor.Simplicidade
As strings no suporte do Switch são úteis para processar dados sem conversão em enum ou
if-else
lógica. Às vezes, é mais fácil ligar o String.Da proposta de recurso na lista de discussão JDK 7 (projeto Coin) ( resposta @gnat )
Versão If-Else
Isso é curto, mas muitos
if's
são difíceis de ler. E isso é lento.Versão enum
Enums precisam ser definidas, isso é bom, mas às vezes não é necessário.
Processando como de costume
JDK 7 - Strings no switch Statements version
Podemos processar sem converter e definir tipos adicionais.
fonte
A maioria das melhorias em qualquer idioma é para facilitar a leitura do código. Eu prefiro código legível do que fantasia a qualquer dia.
Você pode não acreditar nisso, mas tente:
fonte
Enums são ótimas e você deve usá-las em vez de Strings quando tiver a capacidade de fazê-lo. Mas há momentos em que você simplesmente não pode, por exemplo, quando precisa trabalhar com algum objeto externo vindo de fora do Java. Imagine que você precisa analisar algo. Como resposta do servidor, configuração, arquivo de log ou algo semelhante: você tem várias opções que procura e não há como essas enumerações. Então, em Java <7, você ficaria preso a um monte de
Você ainda pode usar enumerações neste caso, apenas tentando obtê-las pelos nomes e / ou fornecendo a rotina String-> Enum personalizada, mas às vezes não é possível ou não é prático (ou seja, quando você precisa criar muitas enumerações)
TLDR : você absolutamente deve usar Enums quando estiver trabalhando exclusivamente com código Java, mas nem sempre é possível com objetos externos. Espero que minha explicação faça sentido.
fonte
if
declarações, então deve encerrá-las de qualquer maneira , o que significa que você ainda pode usar enumerações ou um padrão de comando etc.Não concordo com a opinião de que é um código mais limpo e legível quando você usa
Strings
declarações de opção e acha que é uma má prática de programação. Se você alterar o valor que você usa para armazenar, precisará alterá-lo a cada opção ou se for o caso. Isso não é bom, pois você está colocando valores codificados em cada código do seu código. O que você fará se um dia decidir mudar um desses valores codificados? Pesquise e substitua todas as cópias?Se você tiver alguns valores codificados que executa as instruções if-elseif, o uso de valores primitivos constantes para eles é muito melhor antes do Java 1.5, apenas porque traz segurança de tipo.
OK, haverá situações em que você obterá valores de String (de solicitação HTTP, arquivos etc.) e convertê-los para os valores primitivos é uma dor de cabeça. Mas
Enum
s fazer um bom trabalho neste momento. Porque quando você deseja alterar o valor armazenado no Enum, basta alterá-lo quando declarar. Não há necessidade de alterar mais nada no seu código. (É claro que você precisa alterar os valores armazenados em outro lugar).É claro que, se você está apenas implementando um código sujo e preguiçoso, é perfeito. Você não deseja envolver a codificação de muitos
Enum
s, mas em um software complexo de grande escala que o matará.fonte
Se você souber quais informações estão chegando e que só podem ser de cinco estados, use um
Enum
. No entanto, se os estados possíveis puderem ser acima de 9000 e você precisar encontrar apenas 42, usar um comutador será melhor porque você não deseja digitar todos esses estados.Um Enum tende a ser a escolha da maioria na maioria das circunstâncias, a menos que os possíveis estados sejam desconhecidos ou existam muitos e você se preocupe apenas com alguns.
Mas por que eles o introduziram agora? Foi apenas uma mudança que permitiu um código mais limpo.
Na versão 1.5, eles também permitiam a criação de corpos personalizados para as Enums.
fonte
default
emswitch
vem para jogar. Eu não sei se você pode ter um estado padrãoEnum
, a menos que você faça um estado padrão, mas esse código fica inchado, enquanto aswitch
é muito mais limpo de usar.UNKNOWN
estado em um Enum está inchado, mas umdefault
caso em um switch não está.