使用一个变量作为另一个不同数据类型但名称相同的变量

时间:2012-07-28 19:15:00

标签: java design-patterns reflection data-structures

我正在使用一个类,我将输入作为文件名和文件位置。我有一个预定义的文件名,所以我将预定义的文件名与我收到的文件名匹配,然后相应地存储值。请看下面的代码

//Set of storage maps and tables 
public class storage
{
//Storage set
public static Set<Integer> tiger = new HashSet<Integer>();

//Storage set
public static Set<Integer> lion = new HashSet<Integer>();

//This is the table used for storing the browser customer count  
public static Table<String,String,Integer> elephant = HashBasedTable.create(); 

//Storage map 
public static Map<String, String> monkey = new HashMap<String, String>();


public static void storeDataDirector(String fileLocation,String fileName) throws     Exception 
{
    if (fileName = monkey) 
                **update the "monkey map"**

}

这是我的问题,我也有很多地图和表格要使用,所以我不能使用多个if条件,然后检查并更新它。

我想知道的是以下

正如我之前所说,我发送给程序的文件名是“String filename”,其名称与“Map monkey”相同,但前者是String,后者是地图。 我想知道我是否能够使用字符串变量作为地图实例的引用,因为它们都具有相同的名称。这将极大地避免我在程序中使用的if条件,因此我想为此解决这个问题...任何与类型case ort相关的内容

3 个答案:

答案 0 :(得分:2)

您需要另一个Map - 其密钥为String,值为Map。像Map<String,Map> allMaps = new HashMap<String,Map>()

这样的东西

获得此地图后,请使用所有文件名和相应的地图monkey填充该地图。

allMaps .put("monkey", monkey)

如果字符串文件名不是map而是set,那么您需要声明更通用的Map<String,Object> allMaps = new HashMap<String,Object>()。当然,这意味着您需要先将值转换为其特定类型,然后再对其执行任何有意义的操作。

然后,要使用此地图,请使用您的文件名参数

Map monkeyAgain = allMaps.get(filename)

答案 1 :(得分:1)

您可以使用反射:

Storage.class.getField(fileName).get(null)

您仍然需要强制转换返回的对象。我不认为这是正确的方法。

答案 2 :(得分:0)

我们的想法是将它们与Map相关联,并使用文件名作为键,例如

Map<String, Map<String, String>>
//  file    store structure

如果您需要通用解决方案,可以通过实现类似于此的接口来实现商店结构的抽象来解决此问题:

// T is the store type and U is the original type (String from file for instance...)
public interface StoreUnit<T, U> {

    void update(U record);

    List<T> list();

}

因此,您将为每种情况(Set,Map,Table ...)实现一个实现,并将使用文件名作为键将其与地图相关联。

monkeyFileName => MapStoreUnit<Entry<String,String>,String>
tigerFileName => SetStoreUnit<Integer, String>
elephantFileName => TableStoreUnit<Entry<Entry<String,String>,String>,String> // not sure if for Table there is something better than Entry ;)

当您想要更新某个商店时,您使用文件名作为键在地图上执行get,并调用使用该记录实现的update方法(可能是String,复杂Object)等等。当您需要从那里阅读某些内容时,您可以使用list方法。