无法避免循环切换序列

时间:2011-12-11 14:13:42

标签: java android switch-statement

我是一名Android / Java初学者,与编码不同,而是使用语言。

我的问题:

我正在绘制一个图表(用于某些统计分析),canvas.drawLine()每行都有不同的颜色。颜色取决于数组的值。该数组(列表)包含具有大约20个不同类型变量的自定义对象。

在某些时候,我需要一个开关来为每个绘制调用获得正确的类型,但对于整个循环,该开关具有相同的结果。由于我几乎完成了该程序,我正在寻找性能问题,这是一个。 该图表至少绘制了1000行,因此交换机运行1000次以获得相同的结果。

如果我有数组而不是自定义对象,我可以简单地使用int来访问不同的数组值。但是没有办法重写它以便可以避免这些对象(会在其他地方浪费大量代码)。

现在我读到了关于多态性和反思但是......说实话,我不想实现一些我不完全理解的东西,这不是防弹的(据说反射很容易出错?!)

我目前的解决方案是我只是为每个案例创建了一个自定义绘图方法。我在循环之前有一个开关,然后使用正确的getter的绘图方法正常工作。它有效,但是只有一行不同的10种方法似乎很疯狂。

现在还有抽象类的东西,但它让我感到困惑,我想知道那些被覆盖的方法是否会比交换机造成更多的性能问题。我读到了一些关于java最终会做什么以及那些跨类方法调用可能会降低性能的东西(我承认它是关于内部/嵌套类调用其outter类的getter的东西)。

我希望代码尽可能简短易读,所以我希望将它全部放在一个代码块(有点)中,而不是分散在不同的类中,但这只是个人偏好。最重要的是,我完全理解我正在实施的内容。我不想要一些例子,我复制并粘贴'在这里输入你的方法'并看到它有效,但不知道为什么或如何。

所以我实际上对理论上我应该做的事情比实际的代码片段更感兴趣(片段不会受到伤害;)

PS:我应该在某个地方有代码味道,随便提一下。

一些代码,简化并专注于问题

Class MyObj {

  int x;
  int y;

  double value_doub;
  short value_short;

  // getters and setters etc
}


private void draw_graph(int switchcase) {
  MyObj mObj;
  int x;
  int y;
  double value;

  for(int i = 0; i < amount_of_values; i++) {

    mObj = mArrayList.get(i);

    x = mObj.getx();
    y = mObj.gety();

    switch(switchcase) {

    case 0:
      value = mObj.get_value_doub();

      //alternatively, direct field access
      value = mObj.value_doub;

      color = calc_color(value, scale_for_this_type);
    break;

    case 1:
      value = (double) mObj.get_value_short();

      //alternatively, direct field access
      value = (double) mObj.value_short;

      color = calc_color(value, scale_for_this_type);
    break;

    // etc...  10+ cases
    }


  drawLine(last_x, last_y, x, y, color);

  }
}

2 个答案:

答案 0 :(得分:1)

您的代码没问题,但不是非常面向对象。我可能会使用某种Drawer接口,并将相应的实现而不是int传递给draw_graph方法(我会将drawGraph重命名为尊重命名约定):

public interface Drawer {
    void draw(MyObj obj, Graphics g);
}

...

private void drawGraph(Drawer drawer) {
    for(int i = 0; i < amountOfValues; i++) {
        MyObj obj = arrayList.get(i);
        drawer.draw(obj, g);
    }
}

...

class Drawer1 implements Drawer {
    @Override
    public void draw(MyObj obj, Graphics g) {
        // same code as in case 1 of the switch
    }
}
class Drawer2 implements Drawer {
    @Override
    public void draw(MyObj obj, Graphics g) {
        // same code as in case 2 of the switch
    }
}

如果所有抽屉都共享一些代码,那么让它们都扩展一个基本的AbstractDrawer类。

答案 1 :(得分:0)

x,y和value是MyObj的属性。 calc_color做了什么,scale_for_this_type来自哪里?这项工作可以在MyObj内完成吗?基于它的领域?如果是这样,你的循环几乎可以调用myObj.drawLineYouFigureOutTheColor(也许是AnArgumentOrTwoHere)。你必须在某处跟踪last_x和last_y。