在样板代码中使用Java Class对象

时间:2012-04-19 02:50:50

标签: java boilerplate

有时,尽管我试图避免它,但我确实在编程中生成了大量的样板代码。我被告知可以使用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。有什么更好的方法来处理这个?理想情况下,我希望有一种方法可以输出具有正确泛型的地图。

1 个答案:

答案 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);