2012-04-19 32 views
-1

有時,儘管我儘量避免它,但我在編程中確實生成了大量的樣板代碼。我被告知可以使用Java Class對象來解決樣板代碼,但我目前沒有看到如何。在樣板代碼中使用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

聽起來很令人費解......你在Java程序,但你發現自己搜索「Java類」?假設這是我缺少的東西,你能發表一些代碼片段來說明你正在處理的問題嗎? – 2012-04-19 02:55:04

+4

請定義「樣板代碼」 – 2012-04-19 02:55:09

+2

爲什麼[performance]標籤? – 2012-04-19 03:00:56

回答

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