java - 如何创建读取制表符分隔文件的通用进程,并从中返回通用 Map

标签 java generics abstract-class

几乎我工作的每个项目都会有某种制表符分隔的文件,我需要读入并返回它的查找 map 。我发现自己一遍又一遍地重写相同的方法。我想创建一些更通用的东西,这样我就不必一直复制和粘贴代码了。在下面的代码中,我只更改了第 9 行和第 16-19 行。所以我只改变了 Map<key, value> ,以及如何将数据输入 map 的实现。有没有办法从中创建一个通用过程,所以每次我想调用这个方法时,我所需要的只是提供我想如何将数据输入到 Map 中的实现,并以某种方式将 Map 更改为更通用的类型好吧。

1. public Map<String, PackageLog> readAllLogsIntoMap(File file){
2.      if (!file.exists())
3.      {
4.          return new HashMap <String, PackageLog> ();
5.      }
6.      BufferedReader reader = null;
7.      FileReader fileReader = null;
8.      String data = null;
9.      Map <String, PackageLog> resultMap = new HashMap <String, PackageLog> ();
10.     try
11.     {
12.         fileReader = new FileReader(file);
13.         reader = new BufferedReader(fileReader);
14.         while ((data = reader.readLine()) != null)
15.         {
16.             PackageLog pl = new PackageLog(data);
17.             if(!pl.getPdfName().equals("")){
18.                 resultMap.put(pl.getPdfName(), pl);
19.             }
20.         }
21.     } catch(Exception e){
22.         
23.     }
24.     finally
25.     {
26.         try{
27.             if (reader != null) reader.close();
28.             if (fileReader != null) fileReader.close();
29.         }catch(IOException ioe){
30.             
31.         }
32.     }
33.     return resultMap;
34. }

最佳答案

  1. 将此方法放在一个抽象的 Util 类中。使用泛型。
  2. 委托(delegate)抽象方法执行第 9 行和第 16-19 行的逻辑。
  3. 在这个类的使用中定义这些抽象方法

例如:

public abstract class ReaderUtil<K, V> {

 protected abstract Map<K, V> newMap(); 
 protected abstract void doThings(String data, Map<K, V> resultMap);

 public Map<K, V> readAllLogsIntoMap(File file){
      if (!file.exists()){
          return newMap();
      }
      BufferedReader reader = null;
      FileReader fileReader = null;
      String data = null;
      Map <K, V> resultMap = newMap();
      try {
         fileReader = new FileReader(file);
         reader = new BufferedReader(fileReader);
         while ((data = reader.readLine()) != null){
             doThings(data, resultMap);
         }
     } catch(Exception e){

     }
     finally{
         try{
             if (reader != null) reader.close();
             if (fileReader != null) fileReader.close();
         } catch(IOException ioe){

         }
     }
     return resultMap;
 }
}

还有一个可能的用途:

ReaderUtil<String, PackageLog> reader = new ReaderUtil<String, PackageLog>(){
    protected Map<String, PackageLog> newMap() { 
        return new HashMap<String, PackageLog>(); 
    }
    protected void doThings(String data, Map<String, PackageLog> resultmap){
        PackageLog pl = new PackageLog(data);
        if(!pl.getPdfName().equals("")){
            resultMap.put(pl.getPdfName(), pl);
        }
    }
};
Map<String, PackageLog> myMap = reader.readAllLogsIntoMap();

考虑到您只需要 newMap()方法,如果你想提供不同的 map 实现。你可以做 new HashMap<K, V>()在泛型类中。

您可能还想定义用于处理异常的钩子(Hook)方法(可覆盖的、可能为空的方法)。

关于java - 如何创建读取制表符分隔文件的通用进程,并从中返回通用 Map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8081829/

相关文章:

来自抽象类的 Java 通用子实例

java - x.y.z 中的 method() 在不可访问的类或接口(interface)中定义

java - 使用外部程序将输入发送到 GDB scanf

java - 将图像复制到新目录并重命名 - Java

C# 泛型未按预期工作

java - 泛型 hell : hamcrest matcher as a method parameter

generics - 为什么泛型的推断不是 "transitive"?

java - 为什么在 Java 实例化过程中要对类命名两次?

java - 无法加载配置类

java抽象类的用法