我有几个假设的二维表,我从中获取数据。我需要创建一个方法,它将获取所需项目的表ID和“坐标”,并返回该项目。到目前为止,我已经尝试使用多层switch
es,但我想知道是否有更好的方法来解决这个问题,因为切换代码似乎太长而不是最佳解决方案。任何帮助将不胜感激。
了解我的代码是什么样的:
switch(tableId) {
case "table 1":
switch(top) {
case "whatever":
switch(side) {
// et cetera
case "table 2":
// etc
}
答案 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
}
}