0

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

我的代码是什么样子的一个想法:

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

2 回答 2

1

您必须以更面向对象的方式重写所有内容,在 Java 中实现它的一种聪明方法是使用一些“调整过的”枚举:

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;
  }
 }

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

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

当然,枚举元素必须与您要拦截的变量名称相同(与您在 if 或 switch 语句的检查条件中放入的名称相同)。另一个类似的结果可以使用映射而不是枚举来实现...查看命令模式以获取更多信息。

于 2012-09-10T19:47:43.217 回答
1

使用多态性

创建接口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);
    }
}

如果您必须获取 table id 而不是 table,只需将Mapfrom table id 保留到相关的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的 s,或者通过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
    }
}
于 2012-09-10T20:13:08.657 回答