我是一名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);
}
}
答案 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。