使用给定的行/列/表号从数据库样式表中获取数据的最佳方法 - Java

时间:2012-09-10 19:26:09

标签: java database switch-statement

我有几个假设的二维表,我从中获取数据。我需要创建一个方法,它将获取所需项目的表ID和“坐标”,并返回该项目。到目前为止,我已经尝试使用多层switch es,但我想知道是否有更好的方法来解决这个问题,因为切换代码似乎太长而不是最佳解决方案。任何帮助将不胜感激。

了解我的代码是什么样的:

switch(tableId) {
    case "table 1":
        switch(top) {
            case "whatever":
                switch(side) {
                    // et cetera
    case "table 2":
        // etc
}

2 个答案:

答案 0 :(得分:1)

你必须以更加面向对象的方式重写所有内容,用Java编写的一种聪明的方法就是使用一些“tuned”枚举:

enum activity { WHATEVER, SOMETHINGELSE } //Use the same principle as in the enum below ...

enum tables {
  TABLE1(activity.WHATEVER),
  TABLE2(activity.SOMETHINGELSE),

  private activity activity;

  tables(activity activity) {
    this.activity = activity;
  }

  public activity activity() {
   return this.activity;
  }
 }

在为每个所需级别创建所需的枚举后,您可以使用以下“技巧”来避免长和多级切换条件语句:

String tableId = ...
//Load the table 
tables table = tables.valueOf(tableId);
//Call the related attached activity ...
table.activity();

当然,枚举元素 必须与您要拦截的变量名称具有相同的名称 (与您在检查条件中输入的名称相同的名称if或switch语句)。 使用地图而不是枚举可以实现另一个类似的结果...... 有关详细信息,请查看Command Pattern

答案 1 :(得分:1)

使用 polymorphism

创建界面SearchableTable

public interface SearchableTable<T> {
    T getItem(int x, int y);
}

如果这些表在您的控制之下,请让它们实现此接口。否则,使用您自己的包装类包装表,如下所示:

public class SearchableTableWrapper implements SearchableTable<MyItemType> {

    private final Table wrappedThirdPartyTable;

    public SearchableTableWrapper(Table wrappedThirdPartyTable) {
        this.wrappedThirdPartyTable = wrappedThirdPartyTable;
    }

    public MyItemType getItem(int x, int y) {
         ...
    }
}

现在,在想要实现接受表id和项的索引的通用方法的通用类中,接受表本身并调用其getItem方法,如下所示:

public class TableUtils {
    public static <T> T getItem(SearchableTable<T> table, int x, int y) {
        return table.getItem(x, y);
    }
}

如果您必须获取表格ID而不是表格,请将表格ID中的Map保留为相关SearchableTable,如下所示:

public class TableUtils {

    private static Map<Long, SearchableTable> tableIdToSearchableTable;

    public static <T> T getItem(SearchableTable<T> table, int x, int y) {
        return table.getItem(x, y);
    }
}

可以通过SearchableTable初始化程序块或静态static方法以多种方式使用实际addTable加载此地图,或者您可以将TableUtils变为非什么都适合你。

这里最重要的是使用多态

修改

您不需要enum。您评论中的Table1应如下所示:

public class Table1 implements SearchableTable<String> {
    public String getItem(int x, int y) {
        // use x and y to fetch the item friom the 2-dimensional data structure
    }
}