什么是超大开关的替代品?

时间:2013-02-05 09:07:44

标签: java android performance

我正在我的应用中集成伪搜索功能。我有一个搜索小部件,它给出了一个搜索提示列表(这些提示来自fts3 sqlite表)。当用户单击搜索提示时,相应的sqlite表将填充listView。

我需要一种方法来根据所选的搜索提示来确定哪个表将填充列表。我正在考虑做这样的事情:

switch(search_hint){
    case(search_hint_1):  useTable(table_1);
                          break;
    case(search_hint_2):  useTable(table_2);
                          break;
    case(search_hint_3):  useTable(table_1 + table_2); // Case when I need to use
                          break;                       // two tables for ListView
}

我确信这是一个可能的解决方案,但如果有几个(数百或数千)个案例怎么办?任何人都可以建议更好的方式来面对这个问题吗?

6 个答案:

答案 0 :(得分:3)

如果可以,请将映射制作成某种对的数组,然后您可以使用for-loopif完成所有这些对。与Refactoring repetitive guard statements中的建议相似。 您需要创建一个类似于保存提示和表的类。

要么是,要么创建一个实际的地图。并使用search_hint作为密钥。

Map< /*insert hint type here*/,Table> mapTable;

例如。

答案 1 :(得分:2)

我认为按照我的想法可行的方式..使用 HashMap键值对..(只有伪代码)

Map<Integer,String> mapTable = new HashMap<Integer,String>();
mapTable.put(search_hint_1,table_1);
.
.
.

只需访问useTable(mapTable.get(search_hint));

即可

答案 2 :(得分:0)

将信息放在搜索提示表中。 你需要仔细考虑一下你所拥有的不同情况,以及如何将它们分解成可配置的小部分。

search_hint_1  table_1
search_hint_2          table_2
search_hint_3  table_1 table_2

答案 3 :(得分:0)

使用枚举器。喜欢:

private static enum DojoDecider {   

    search_hint_1(table_1),
    search_hint_2(table_2);     

    private Table var;      

    private DojoDecider(Table var) {
        this.var = var;
    }

    @SuppressWarnings("unused")
    public Table getVar() {
        return var;
    }           
}

答案 4 :(得分:0)

final int[] hintArray = {search_hint_1, search_hint_2, search_hint_3};
final String[] tableArray = {table_1, table_2, table_3};

private Map<Integer,String> hintMap = new HashMap<Integer,String>();

// Populate the map, probably at onCreate() of your activity
for(int i=0; i<hintArray.length; i++) {
    hintMap.put(hintArray[i], tableArray[i]);
}

// When you want to get it
useTable(hintMap.get(search_hint));

答案 5 :(得分:0)

switch语句是面向对象设计中的反模式(参见Object Thinking)。你应该使用继承。