有时,尽管我试图避免它,但我确实在编程中生成了大量的样板代码。我被告知可以使用Java Class对象来解决样板代码,但我目前没有看到如何。
当我说样板代码时,我指的是用于指代一次又一次重复使用的文本的术语,稍作修改。
public Map<String, Boolean> loadBooleanTags(File in)
{
// Code that extracts boolean tags
}
现在,假设您要加载int标记,其中文件的格式完全相同,但您希望数据结构为Map<String, Integer>
。我能想到处理这个问题的唯一方法是:
public Map<String, Integer> loadIntegerTags(File in)
{
// Code that extracts integer tags
}
基本上,我复制并通过布尔方法,但我让它解析一个Integer。有什么更好的方法来处理这个?理想情况下,我希望有一种方法可以输出具有正确泛型的地图。
答案 0 :(得分:3)
有趣的问题。首先,自{1}以来Class
已经存在。其次,我认为这是您正在寻找的模式:
public abstract class GenericMapFactory<T>
{
public Map<String,T> makeMap(File in) throws InstantiationException, IllegalAccessException, IOException
{
Map<String,T> result = new HashMap<String,T>();
BufferedReader rdr = new BufferedReader(new FileReader(in));
String line = null;
while ((line=rdr.readLine()) != null)
{
String key = "" /* something meaningful for your application */;
T item = parse(line);
result.put(key, item);
}
return result;
}
protected abstract T parse(String line);
}
对于您需要的每个变体,您都需要提供专业化,例如:
public static class IntMapFactory extends GenericMapFactory<Integer>
{
@Override
protected Integer parse(String line)
{
Integer result = null;
// parse the line, setting the value of result
return result;
}
}
所有'样板'代码都被分解为通用超类,只需要编写特定于类型的代码。您可以按如下方式使用它:
File in = ...
Map<String,Integer> msi = new IntMapFactory().makeMap(in);