Java代码效率。我应该使用开关吗?

时间:2012-08-23 23:28:14

标签: android switch-statement

好的,我的问题是这个

        switch (charType) {
    case Mush:
        switch (charColor) {
        case Blue:
            switch (charDirec) {
            case Left:
                bitmap = (Bitmap) BitmapFactory.decodeResource(
                        mainContext.getResources(), R.drawable.l_blue_m);
                break;
            case Right:
                bitmap = (Bitmap) BitmapFactory.decodeResource(
                        mainContext.getResources(), R.drawable.r_blue_m);
                break;
            case Bounce:
                bitmap = (Bitmap) BitmapFactory.decodeResource(
                        mainContext.getResources(), R.drawable.b_blue_m);
                break;
            case Walk:
                bitmap = (Bitmap) BitmapFactory.decodeResource(
                        mainContext.getResources(), R.drawable.w_blue_m);
                break;
            }
            break;
        case Red:
            switch (charDirec) {
            case Left:
                bitmap = (Bitmap) BitmapFactory.decodeResource(
                        mainContext.getResources(), R.drawable.l_red_m);
                break;
            case Right:
                bitmap = (Bitmap) BitmapFactory.decodeResource(
                        mainContext.getResources(), R.drawable.r_red_m);
                break;
            case Bounce:
                bitmap = (Bitmap) BitmapFactory.decodeResource(
                        mainContext.getResources(), R.drawable.b_red_m);
                break;
            case Walk:
                bitmap = (Bitmap) BitmapFactory.decodeResource(
                        mainContext.getResources(), R.drawable.w_red_m);
                break;
            }
        case Tan:
            switch (charDirec) {
            case Left:
                bitmap = (Bitmap) BitmapFactory.decodeResource(
                        mainContext.getResources(), R.drawable.l_tan_m);
                break;
            case Right:
                bitmap = (Bitmap) BitmapFactory.decodeResource(
                        mainContext.getResources(), R.drawable.r_tan_m);
                break;
            case Bounce:
                bitmap = (Bitmap) BitmapFactory.decodeResource(
                        mainContext.getResources(), R.drawable.b_tan_m);
                break;
            case Walk:
                bitmap = (Bitmap) BitmapFactory.decodeResource(
                        mainContext.getResources(), R.drawable.w_tan_m);
                break;
            }
            break;
        }
        break;
    case Slime:
        switch (charColor) {
        case Blue:
            switch (charDirec) {
            case Left:
                bitmap = (Bitmap) BitmapFactory.decodeResource(
                        mainContext.getResources(), R.drawable.l_blue_s);
                break;
            case Right:
                bitmap = (Bitmap) BitmapFactory.decodeResource(
                        mainContext.getResources(), R.drawable.r_blue_s);
                break;
            case Bounce:
                bitmap = (Bitmap) BitmapFactory.decodeResource(
                        mainContext.getResources(), R.drawable.b_blue_s);
                break;
            case Walk:
                bitmap = (Bitmap) BitmapFactory.decodeResource(
                        mainContext.getResources(), R.drawable.w_blue_s);
                break;
            }
            break;
        }
        break;
    }

处理此问题的更好方法是什么?或者这是正确的吗?

2 个答案:

答案 0 :(得分:3)

您可以先将方法拆分为两个更简单的方法。一种方法应该找到正确的资源ID,另一种方法实际上取出Bitmap

int resourceId = getResourceId(charType, charColor, charDirec);
bitmap = (Bitmap)BitmapFactory.decodeResource(
    mainContext.getResources(), resourceId);

这个简单的更改已经删除了很多重复的代码。

getResourceId方法中,您可能需要考虑使用地图来查找资源ID而不是嵌套切换。

Map<CharKey, Integer> map = new HashMap<CharKey, Integer>();

int getResourceId(charType, charColor, charDirec)
{
    CharKey key = new CharKey(charType, charColor, charDirec);
    return map.get(key).intValue();
}

剩下的就是在程序启动时填充字典。

答案 1 :(得分:1)

我假设您正在使用charType,charColor,charDirec的枚举 - 如果更改为整数,则可以简单地创建一个3D数组,并将其用作索引。在应用程序启动时预先填充一次,这看起来像

int[][][] resources;

public void initResources(int numTypes, int numColors, int numDirections) {
  resources = new int[numTypes][numColors][numDirections];
  resources[MUSH][BLUE][LEFT] = R.drawable.l_blue_m;
  resources[MUSH][BLUE][RIGHT] = R.drawable.r_blue_m;
  // etc etc
}

然后您可以像以后一样访问ID:

int resourceID = resources[charType][charColor][charDirec];
bitmap = (Bitmap) BitmapFactory.decodeResource(
                    mainContext.getResources(), resourceID);

这样,每次想要查找位图ID时,您的应用程序都不需要导航switch语句,只需访问多维数组中的相关索引。