Java 使用Enum來取得相對應的Class

摘要:Java 使用Enum來取得相對應的Class

今天做了一個很類似工廠模式,但又沒用工廠模式,又類似決策模式,又沒有用switch的東西,來做一個依type取得相對應的class

為了做一個介面,用來將不同讀取檔案格式的方法設給這個介面。

所以我宣告了一個介面為 FileExtractor 他只有一個方法叫 List<String[]> extract(String filepath);

public interface FileExtractor {
       public List extract(String filepath);
}

然後新建三個類別實作這個介面ExcelFileExtractor、CsvFileExtractor、PdfFileExtractor

目前已實作完一個CsvFileExtractor,他裡面使用opencsv能讀取csv檔案。

http://opencsv.sourceforge.net/#how-to-read

public class CsvFileExtractor implements  FileExtractor
{
       public List extract(String filepath)
       {
            List result ;
            try
            {
                CSVReader reader = new CSVReader(new FileReader(filepath));
                result = reader.readAll();
                reader.close();
            }catch(Exception ex)
            {
                ex.printStackTrace();
                result = null;
            }

            return result;
       }
}

而使用時,會需要一個判別的enum型別為FileExtension

public enum FileExtension {
    /**
     * CSV檔
     */
    CSV("csv",CsvFileExtractor.class),
    /**
     * Excel檔
     */
    EXCEL("xls",ExcelFileExtractor.class),
    /**
     * Pdf檔
     */
    PDF("pdf",PdfFileExtractor.class);

    /**
     * 副檔名名稱
     */
    private String extension;
    /**
     * 副檔名名稱
     */
    private Class extractor;
    /**
     * 建構子
     *
     * @param ext  執行碼
     */
    private FileExtension(String ext,Class c ) {
        this.extension = ext;
        this.extractor = c;
    }

    /**
     * 取得執行碼所對應的FileExtension
     *
     * @param extension 副檔名名稱
     * @return FileExtension
     */
    public static FileExtension get(String extension) {
        if (CSV.extension.equals(extension)) return CSV;
        if (EXCEL.extension.equals(extension)) return EXCEL;
        if (PDF.extension.equals(extension)) return PDF;
        return null;
    }

    /**
     * 取得Extractor類別
     *
     * @return Class
     */
    public Class getExtractor() {
        return   this.extractor;
    }
}

我在主執行程式中取得了他的副檔名

    public static String  getFileExtension(String filepath)
    {
          String fname="";
          String ext="";
          int mid= filepath.lastIndexOf(".");
          fname=filepath.substring(0,mid);
          ext=filepath.substring(mid+1,filepath.length());
          return ext;
    }

取得副檔名後,用副檔名取得列舉,再用此列舉取得相對應的處理FileExtractor

          String extension = getFileExtension(filePath).toLowerCase();
          FileExtension extType = FileExtension.get(extension);
          FileExtractor extractor;
          List result;
     
          try
          {
             Object o = extType.getExtractor().newInstance();
             extractor= (FileExtractor) o;
             result = extractor.extract(filePath);
             print(result);
          }catch(Exception ex)
          {
             ex.printStackTrace();
          }

然後將資料列印出來

    public void print(List result)
    {
          int line_number = 0;
          int col_count = 0 ;
          int col_number = 0 ;
          for(String[] line:result)
          {
                line_number++;
                System.out.print("第"+line_number+"列:");
                col_count = line.length;
                col_number = 0;
                for(String value:line)
                {
                      col_number++;
                      System.out.print(value);
                      if(col_number!=col_count)
                          System.out.print("|");
                }
                 System.out.println("");
          }
    }

這樣就大功告成了。