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?

6 Solutions collect form web for “Múltiples declaraciones if”

¿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; } 

  • Api de rendimiento de Android nivel 11 y superior
  • Extraño problema de rendimiento con Galaxy Tab
  • Android Google Map addMarker () muy lento al agregar 400 marcadores
  • Dibujo (filtrado) 100k + puntos a MapView en Android
  • Facebook SDK para Android - el primer inicio de sesión es muy lento / lleva mucho tiempo
  • FindViewById varias veces VS variable global
  • La almohadilla de firma es lenta en android
  • AVD no se está ejecutando
  • Webview para ampliar la presentación con el tipo de vista
  • Manejo de mapas de bits grandes
  • Cómo forzar el uso máximo de la CPU
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.