多个if语句

时间:2012-05-25 13:59:20

标签: java android performance button if-statement

假设我说我正在使用一个if语句来说明向事件监听器发送事件值的十个不同的可能按钮:

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

对这些进行分类会更有效吗?比如...一个用于陷阱的onClick事件和一个用于低音的onClick和一个用于嗨帽子的事件,这样当按下一个按钮时,程序不必计算每个if语句,只有一个是在被调用者的监听器内事件

6 个答案:

答案 0 :(得分:5)

这样的事情怎么样?

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);

将HashMap作为类变量,并在onCreate或其他东西中初始化映射。然后你可以将它用于你的听众:

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

这样做的好处是,如果将来必须添加更多按钮,则只需使用新的声音映射修改地图初始化方法;听众不需要任何改变。

答案 1 :(得分:1)

只是为了在这里添加丰富的建议和意见,并在之前同意所有关于“这真的是一个性能问题”,我会寻求使代码最易于阅读和维护的结构,以及其他可能需要维护它的人。通过维护,还要考虑扩展它。如果你想再增加5个音垫,会在3个月内发生什么?

减少到最小行数可能会给你一些几乎不可估量的性能提升,并在你的APK中节省几个字节,但在大多数情况下,为了便于阅读,我会交换它。

所有这一切,我确实喜欢kcoppocks的解决方案。对我来说,这是短暂的甜蜜和优雅,我会怎么做,但是,如果你的经验水平不同,你不能只看它并说“啊,是的,我得到它”,然后保持你的ifs,或者更好,一个开关。

答案 2 :(得分:0)

在你知道这是一个问题之前,我不担心会破坏它。切换有助于减少重复的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;
}

答案 3 :(得分:0)

在这种情况下,表现并不值得担心。条件语句所花费的时间将由围绕它的事件处理代码彻底相形见绌。第一到第三个绩效定律是衡量,衡量,衡量,而且我对找到差异的可能性持怀疑态度。

我不禁注意到,唯一改变的是pool.play的第一个参数。 bass1,bass2等与相应的v值之间是否存在关系?

答案 4 :(得分:0)

我不认为它是必要的,但我肯定会推荐开关和案例。你可以订购最常见的最不常见的但它的这么小的改变,不会被注意到。完成那些if语句并不需要很长时间。

答案 5 :(得分:0)

我不知道这个if运行了多少次,但这对我来说似乎效率不高。这个布尔测试非常快。 无论如何,如果你想尽可能提高效率,我会看到两个选择:

  1. 简单的方法:使用else if代替if
  2. 复杂的一个:使用一组ActionIf个对象来做你想做的事:
  3. 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;
    }
    

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