Múltiples declaraciones if

Hipoteticamente vamos a decir que estoy usando una instrucción if para tener en cuenta diez diferentes presiones de botón posibles que envían un valor de evento a un detector de eventos:

public boolean onTouch(int v) { //this is my only listener for all ten buttons if(event.getAction() == MotionEvent.ACTION_DOWN){ if(v==button_one){pool.play(bass1, 1f,1f, 1, 0, 1f);} if(v==button_two){pool.play(bass2, 1f,1f, 1, 0, 1f);} if(v==button_three){pool.play(bass3, 1f,1f, 1, 0, 1f);} if(v==button_four){pool.play(snare1, 1f,1f, 1, 0, 1f);} if(v==button_five){pool.play(snare2, 1f,1f, 1, 0, 1f);} if(v==button_six){pool.play(snare3, 1f,1f, 1, 0, 1f);} if(v==button_seven){pool.play(hh1, 1f,1f, 1, 0, 1f);} if(v==button_eight){pool.play(hh2, 1f,1f, 1, 0, 1f);} } return false; } 

¿Sería más eficiente categorizar esto? Decir … un acontecimiento del onClick para los lazos y uno para los bajos y uno para los sombreros del hola de modo que cuando un botón es presionado el programa no tiene que contar con cada declaración del if, solamente el que está dentro del oyente para el fuego ¿evento?

¿Qué hay de algo como esto?

 HashMap<int,int> soundMap = new HashMap<int,int>(); soundMap.put(button_one, bass1); soundMap.put(button_two, bass2); soundMap.put(button_three, bass3); soundMap.put(button_four, snare1); soundMap.put(button_five, snare2); soundMap.put(button_six, snare3); soundMap.put(button_seven, hh1); soundMap.put(button_eight, hh2); 

Tener el HashMap como una variable de clase, y tener la asignación inicializada en onCreate o algo. Entonces usted puede utilizar esto para su oyente:

 public boolean onTouch(int v) { if(event.getAction() == MotionEvent.ACTION_DOWN) { pool.play(soundMap.get(v), 1f, 1f, 1, 0, 1f); } return false; } 

La ventaja de esto es que si tiene que agregar más botones en el futuro, sólo tiene que modificar el método de inicialización de mapa con la nueva asignación de sonido; El oyente no requerirá ningún cambio.

Sólo para añadir a la rica vena de consejos y opiniones aquí, y de acuerdo con todos los anteriores sobre "es realmente un problema de rendimiento", me gustaría ir a la estructura que hace que el código más fácil de leer y mantener a usted, y cualquier otra persona que Puede que tenga que mantenerlo. Con el mantenimiento, piense también en ampliarlo. ¿Qué sucede en 3 meses cuando se quiere añadir 5 almohadillas de sonido más?

Reducir el número mínimo de líneas puede darle un impulso de rendimiento casi immeasaruble y guardar unos pocos bytes en su APK, pero en la mayoría de los casos, que el comercio que la legibilidad.

Todo lo dicho, me gusta la solución kcoppocks. Para mí, es corto dulce y elegante y cómo lo haría, pero, si su nivel de experiencia difiere y no se puede simplemente mirar y decir "ah sí, lo entiendo", a continuación, mantener su ifs, o Mejor, un interruptor.

No me preocuparía por romper eso hasta que supieras que es un problema. Un conmutador ayudaría a reducir la repetición de la sentencia if :

 public boolean onTouch(int v) { if(event.getAction() == MotionEvent.ACTION_DOWN) { switch (v) { case button_one: pool.play(); break; case button_two: pool.play(..); break; ... } } return false; } 

No vale la pena preocuparse por el rendimiento en este caso; El tiempo necesario para la instrucción condicional va a ser completamente empequeñecido por el código de manejo de eventos que lo rodea. La primera a la tercera leyes de rendimiento son medidas, medidas, medidas, y soy escéptico acerca de las posibilidades de encontrar una diferencia.

No puedo dejar de notar que lo único que cambia es el primer argumento para pool.play. ¿Existe una relación entre bass1, bass2, etc y los valores v correspondientes?

No creo que es necesario, pero sin duda recomendaría cambiar y caso. Puede ordenar como lo más común a menos común pero es un pequeño cambio que no se notará. No se necesita mucho tiempo para pasar por esas declaraciones.

No sé cuántas veces esto funciona, pero no me parece ineficiente. Esta prueba booleana es muy rápida. De todos modos, si usted quiere hacerlo tan eficiente como sea posible, veo dos opciones:

  1. El más fácil: use else if lugar de if .
  2. La complicada: utilice una matriz de objetos ActionIf para hacer lo que desea:
 public interface ActionIf { public void go(); } public class ActionBass1 implements ActionIf { @Override public void go() { pool.play(bass1, 1f,1f, 1, 0, 1f); } } public class ActionBass2 implements ActionIf { @Override public void go() { pool.play(bass2, 1f,1f, 1, 0, 1f); } } ... public ActionIf[] actions = {new ActionBass1(), new Action Bass2(), ...); public boolean onTouch(int v) { //this is my only listener for all ten buttons if(event.getAction() == MotionEvent.ACTION_DOWN && v >= 0 && v <= (button_eight-button_one)){ actions[button_one+v].go(); } return false; } 

  • Código postal / código postal de android lugar objeto
  • Swiffy-convertidos Flash a HTML5 animados anuncios de Google AdSense causar un rendimiento terrible jank en Chrome para Android
  • Minimice la aplicación cuando haga clic en el botón Atrás android
  • Rendimiento en Android Juego
  • Compresión de mapa de bits y optimización de velocidad en Android
  • Falta el puerto reenviado en el Visor de jerarquía: Uso de Android Studio
  • Android webview rendimiento, ¿qué me falta?
  • Manejo de mapas de bits grandes
  • Rendimiento del dispositivo virtual Android
  • ¿Cómo puede el código nativo de Android dirigirse a múltiples tipos de procesadores?
  • ¿Cómo funciona un Android Studio con las funciones de System.out.print al hacer una versión final de una aplicación?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.