-1

有时,尽管我尽量避免它,但我确实在我的编程中生成了大量的样板代码。有人告诉我 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
}

本质上,我复制并过去了布尔方法,但我让它解析一个整数。有什么更好的方法来处理这个问题?理想情况下,我希望有一种方法可以输出具有正确泛型的地图。

4

1 回答 1

3

有趣的问题。首先,Class自 Java 1 以来一直存在。其次,我认为这是您正在寻找的模式:

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);
于 2012-04-19T04:57:16.447 回答