Para eventos de Android, ¿por qué las sentencias switch son más comunes que if-else?

Cuando el desarrollo de Android es una declaración de switch más eficiente que una cadena if-else? Una sentencia de switch toma más líneas de código, pero mirar la evidencia anecdótica parece ser la más comúnmente utilizada en las aplicaciones de Android.

Los siguientes ejemplos ilustran el mismo constructo de programación con una instrucción case y una cadena if-else. La instrucción switch requiere 10 líneas mientras que la cadena if-else requiere 7.

Declaración del caso

public void onClickWithSwitch(View v) { switch(v.getId()) { case R.id.buttonA: buttonA(); break; case R.id.buttonB: buttonB(); break; case R.id.buttonC: buttonC(); } } 

Cadena If-else

 public void onClickWithIf(View v) { int id = v.getId(); if(id == R.id.buttonA) buttonA(); else if (id == R.id.buttonB) buttonB(); else if (id == R.id.buttonC) buttonC(); } 

¿Por qué sería más común que una cadena if-else? ¿Las sentencias switch ofrecen un mejor rendimiento en comparación con las cadenas if-else?

La razón por la que los lenguajes tienen sentencias switch es permitir que el compilador genere una tabla de salto, que es rápida si es grande, porque en tiempo de ejecución puede llegar al código deseado en O (1) en lugar de O (N).

Sólo es útil en cuanto a velocidad, si hay muchos casos y el código para ejecutar en cada caso no toma mucho tiempo, y el programa gasta mucho porcentaje de tiempo en este código en absoluto.

Aparte de eso, es puramente una cuestión de gusto.

No hay relación entre el número de líneas de código y la velocidad. Lo que importa es el tipo de código de lenguaje de ensamblaje que se genera, que te animo a familiarizarse con.

A menos que su secuencia de ifs / casos sea realmente vasta, no creo que importe. Con la declaración switch, está más claro lo que está pasando. El único inconveniente es que todas las declaraciones de break y el potencial de perder una, pero un analizador estático debe captar eso.

Lo mejor sería un mapa marcado por el id o algún uso inteligente de la subclase

"Más eficiente" es un concepto vago, porque hay tantas maneras de medirlo. Supongo que la mayoría de la gente piensa en tiempo de ejecución. Por otro lado, la mayoría de la gente no piensa en la eficiencia de la memoria. Una sentencia switch con valores de prueba ampliamente espaciados puede ser un horrible cerdo de memoria, a menos que el compilador sea lo suficientemente inteligente como para volver a interpretarlo como una cadena if-else.

Hay mucho que decir, también, para la eficiencia de la programación, incluyendo mantenimiento y legibilidad. Como nota sblundy, una instrucción switch puede ser más clara acerca de la intención del programador que una cadena if-else. Los comentarios pueden contrarrestar eso, pero eso requiere más trabajo para el programador y también existe el riesgo de que los comentarios y el código no coincidan (especialmente después de unos cuantos ciclos de mantenimiento).

Me imagino que la mayoría de la gente sigue todo el estilo que se les ha enseñado (o se le dijo a seguir), sin pensar demasiado en ello. El resto del tiempo, creo que la mayoría de las decisiones acerca del cambio vs. if-else se basan en cuál es la que mejor coincide con el pensamiento del programador en el momento en que se está generando el código.

Usted preguntó: ¿Es una declaración de switch realmente más eficiente?

Cualquiera que diga tener una respuesta definitiva y general sobre esta cuestión, habla tonterías. Hay exactamente una manera de averiguar cuál es más rápido en su caso: Utilice un marco de micro-benchmarking adecuado en su plattform de destino con su software completo, no un ejemplo simplificado. Si eso revela una diferencia mensurable y estadísticamente significativa, estaría interesado en saberlo. Dudo que encuentre alguna diferencia medible para un programa real.

Por lo tanto, yo iría estrictamente para la legibilidad.

Mientras estamos en el tema, nadie mencionó que siempre debe tener una línea por default en la instrucción switch. Por lo general, desea lanzar una excepción, pero al menos debe afirmar y / o registrar el error.

Esta es sólo una buena programación defensiva básica. Le avisa que tiene un error de programación si agrega más un botón (en este caso).

  • Android: El botón OnClickListener no funciona
  • Cómo cambiar entre la cámara delantera y trasera cuando se utiliza MediaRecorder android
  • Un problema Java de conmutación: las expresiones de caso deben ser expresiones constantes
  • Menú emergente personalizado de Android con conmutador
  • ¿O declaración en el interruptor / caso?
  • Diferenciar los diálogos individuales con DialogInterface.OnClickListener
  • If-else trabajando, no cambie
  • Cómo cambiar entre actividades con viewflipper
  • ¿Usando la cadena del recurso XML en el interruptor?
  • Android: cambia a la actividad sin reiniciarla
  • El texto de Android debe aparecer en ambos lados en el
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.