-1

ときどき、それを避けようとしますが、プログラミングでかなりの量のボイラープレート コードを生成します。Java クラス オブジェクトを使用してボイラープレート コードを回避できると聞いたことがありますが、現在のところその方法はわかりません。

ボイラープレート コードと言うときは、わずかな変更を加えて何度も再利用されるテキストを指す用語を指しています。

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
}

基本的には、ブール値のメソッドをコピー アンド ペーストしますが、代わりに整数を解析するようにします。これを処理するためのより良い方法は何ですか? 理想的には、正しいジェネリックを使用してマップを出力する 1 つのメソッドが必要です。

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 に答える