switch代替if與 instanceof 結合的使用(switch的case語句判斷Class類型)
switch 語句中的變量類型可以是: byte、short、int 或者 char。從 Java SE 7 開始,switch 支持字符串 String 類型了,同時 case 標籤必須爲字符串常量或字面量。
思路:從switch支持的變量類型中,我們可以看到,switch還不支持java的抽象出來的Class類型。但是switch已經支持String類型了,對我們而言已經很靈活了。我們可以轉變思路,提取出java中每種對象的和String有關的Class類型的區別。那就是抽象Class對象的name名字,不同的抽象Class的name名字是不一樣的。
我應用中的例子:(應用的是利用poi生成excel,爲每個cell賦值,通用的賦值方法,需要對新類型進行擴展)
if與 instanceof 的實現
public static void setIfCellValue(Cell cell, Object object){
if(object instanceof String){
cell.setCellValue((String) object);
}else if(object instanceof Integer){
cell.setCellValue((Integer) object);
}else if(object instanceof Long){
cell.setCellValue((Integer) object);
}else if(object instanceof Float){
cell.setCellValue((Float) object);
}else if (object instanceof Double) {
cell.setCellValue((Double) object);
}else if (object instanceof Boolean) {
cell.setCellValue((Boolean) object);
}else if(object instanceof Date){
cell.setCellValue((Date) object);
}else if(object instanceof Calendar){
cell.setCellValue((Calendar) object);
}else if(object instanceof XSSFRichTextString){
cell.setCellValue((XSSFRichTextString) object);
}
}
switch的實現
public static void setCellValue(Cell cell, Object object){
if(object == null){
return;
}
switch(object.getClass().getName()){
case "java.lang.Integer":
cell.setCellValue((Integer) object);
break;
case "java.lang.Long":
cell.setCellValue((Long) object);
break;
case "java.lang.Float":
cell.setCellValue((Float) object);
break;
case "java.lang.Double":
cell.setCellValue((Double) object);
break;
case "java.lang.Boolean":
cell.setCellValue((Boolean) object);
break;
case "java.util.Date":
cell.setCellValue((Date) object);
break;
case "java.util.GregorianCalendar":
cell.setCellValue((Calendar) object);
break;
case "org.apache.poi.xssf.usermodel.XSSFRichTextString":
cell.setCellValue((XSSFRichTextString) object);
break;
default:
cell.setCellValue((String) object);
}