摘要: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("");
}
}
這樣就大功告成了。